----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------
1、網絡模型:OSI參考模型(7層)和TCP/IP參考模型(4層)
2、網絡通信要素:IP地址,端口號、傳輸協議。
1)IP地址:
A、它是網絡中的設備標識
B、不易記憶,可用主機名錶示,兩者存在映射關係
C、本機迴環地址:127.0.0.1,主機名爲:localhost
2)端口號:
A、用於標識進程的邏輯地址,不用進程的標識。
B、有效端口:0 ~ 65535,系統使用或保留的端口是:0 ~ 1024.
3)傳輸協議:
A、即通信規則,包含TCP和UDP協議
B、UDP是面向無連接,無論在不在網上,只管傳輸,不在就會丟失數據。只求速度,應用於網絡視頻會議和聊天等應用程序中
協議特點:
a、面向無連接,即將數據及源和目的封裝成數據包中,不建立鏈接的發送
b、每個數據報的大小限制在64K之內
c、因無連接,是不可靠的協議
d、不建立連接,速度快。可以類比傳呼機,呼叫不確定對方是否在。
C、TCP是面向連接的,必須連接成功才能傳輸數據,應用於下載等程序上
協議特點:
a、面向連接,在建立連接後,形成傳輸數據的通道
b、在連接中進行大數據量的傳輸
c、通過三次握手完成連接,是可靠的協議
d、必須建立連接,效率稍慢。
可以類比打電話,需要兩邊相互交流。
三次握手:第一次本方發送請求,第二次對方確認連接,第三次本方再次確認連接成功。
import java.io.*;
import java.net.*;
//發送數據
class SendSocket implements Runnable
{
//定義全局變量
private DatagramSocket ds;
//初始化發送類對象的參數
public SendSocket(DatagramSocket ds)
{
this.ds = ds;
}
//覆寫run方法,此線程發送鍵盤錄入的數據
public void run()
{
try
{
//創建讀取流,讀取鍵盤數據
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line))
break;
byte[] b = line.getBytes();
//創建發送服務對象,將數據發送出去
DatagramPacket dp =
new DatagramPacket(b,b.length,InetAddress.getByName("192.168.1.255"),10001);
ds.send(dp);
}
//關閉資源
ds.close();
}
catch (Exception e)
{
throw new RuntimeException("發送失敗");
}
}
}
//接收數據
class ReceSocket implements Runnable
{
//定義全局變量
private DatagramSocket ds;
//初始化接收類對象的參數
public ReceSocket(DatagramSocket ds)
{
this.ds = ds;
}
//覆寫run方法,此線程接收數據
public void run()
{
try
{
//循環讀取接收到的數據
while(true)
{
//創建字節數組存儲數據
byte[] by = new byte[1024];
//創建接收數據的對象,接收數據
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
//獲取發送方的ip地址
String ip = dp.getAddress().getHostAddress();
//getData獲取byte數組中的數據
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}
}
catch (Exception e)
{
throw new RuntimeException("接收失敗");
}
}
}
//測試
class SocketDemo
{
public static void main(String[] args) throws Exception
{
//創建發送和接收服務的對象
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10001);
//創建兩個線程,同時執行
new Thread(new SendSocket(sendSocket)).start();
new Thread(new ReceSocket(receSocket)).start();
}
}
----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------