在現有的網絡中,網絡通訊的方式主要有兩種:
1、 TCP(傳輸控制協議)方式
2、 UDP(用戶數據報協議)方式
爲 了方便理解這兩種方式,還是先來看一個例子。大家使用手機時,向別人傳遞信息時有兩種方式:撥打電話和發送短信。使用撥打電話的方式可以保證將信息傳遞給 別人,因爲別
人接聽電話時本身就確認接收到了該信息。而發送短信的方式價格低廉,使用方便,但是接收人有可能接收不到。
在網絡通訊中,TCP方式就類似於撥打電話,使用該種方式進行網絡通訊時,需要建立專門的虛擬連接,然後進行可靠的數據傳輸,如果數據發送失敗,則客戶端會自動重發該數據。
而UDP方式就類似於發送短信,使用這種方式進行網絡通訊時,不需要建立專門的虛擬連接,傳輸也不是很可靠,如果發送失敗則客戶端無法獲得。
這兩種傳輸方式都是實際的網絡編程中進行使用,重要的數據一般使用TCP方式進行數據傳輸,而大量的非核心數據則都通過UDP方式進行傳遞,在一些程序中甚至結合使用這兩種
方式進行數據的傳遞。
由於TCP需要建立專用的虛擬連接以及確認傳輸是否正確,所以使用TCP方式的速度稍微慢一些,而且傳輸時產生的數據量要比UDP稍微大一些。
一、TCP傳輸編程
1、TCP傳輸
1)Socket和ServerSocket
2)建立客戶端和服務器端
3)建立連接後,通過Socket中的IO流進行數據的傳輸
4)關閉socket
客戶端與服務器端是兩個獨立的應用程序。
2、思路及流程
1)基本思路(客戶端)
a、客戶端需要明確服務器的ip地址以及端口,這樣纔可以去試着建立連接,如果連接失敗,會出現異常。
b、連接成功,說明客戶端與服務端建立了通道,那麼通過IO流就可以進行數據的傳輸,而Socket對象已經提供了輸入流和輸出流對象,通過getInputStream(), getOutputStream()獲
取即可。
c、與服務端通訊結束後,關閉Socket。
2)基本思路(服務器端)
a、服務端需要明確它要處理的數據是從哪個端口進入的。
b、當有客戶端訪問時,要明確是哪個客戶端,可通過accept()獲取已連接的客戶端對象,並通過該對象與客戶端通過IO流進行數據傳輸。
c、當該客戶端訪問結束,關閉該客戶端。
基於TCP的Socket通信流程:
3、具體操作
1)客戶端
通過Socket建立對象並指定要連接的服務端主機以及端口。
Socket s = new Socket(“192.168.1.1”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();
2)服務器端
建立服務端需要監聽一個端口。
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();//這就是一個監聽端口
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();
4、思考
問題:對於Web服務器而言,當有多個客戶端同時訪問服務器時,服務端又如何提供服務呢?
答:通過線程來提供服務。每接收一個客戶端請求,就new一個線程與其通訊。
5、TCP傳輸最容易出現的問題
客戶端連接上服務端,兩端都在等待,沒有任何數據傳輸。
通過例程分析:
因爲read方法或者readLine方法是阻塞式。
解決辦法:
自定義結束標記
使用shutdownInput,shutdownOutput方法。
6、編程練習
鏈接:點擊打開鏈接
二、UDP傳輸編程
1、UDP傳輸
1)DatagramSocket與DatagramPacket
2)建立發送端,接收端。
3)建立數據包。
4)調用Socket的發送接收方法。
5)關閉Socket。
發送端與接收端是兩個獨立的運行程序。
2、具體操作
1)發送端
在發送端,要在數據包對象中明確目的地IP及端口。
DatagramSocket ds = new DatagramSocket();
byte[] by = “hello,udp”.getBytes();
DatagramPacket dp = new DatagramPacket(by,0,by.length,InetAddress.getByName(“127.0.0.1”),10000);
ds.send(dp);
ds.close();
在接收端,要指定監聽的端口。
DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();
3、練習
UDP聊天程序:(1)通過鍵盤錄入獲取要發送的信息。
(2)將發送和接收分別封裝到兩個線程中
鏈接:點擊打開鏈接
三、TCP和UDP比較
1、UDP
1)將數據及源和目的封裝成數據包中,不需要建立連接
2)每個數據報的大小在限制在64k內
3)因無連接,是不可靠協議
4)不需要建立連接,速度快
DatagramSocket和DatagramPacket類
2、 TCP
1)建立連接,形成傳輸數據的通道。
2)在連接中進行大數據量傳輸
3)通過三次握手完成連接,是可靠協議
4)必須建立連接,效率會稍低
Socket 和 ServerSocket類
3、Socket
1)Socket就是爲網絡服務提供的一種機制。
2)通信的兩端都有Socket。
3)網絡通信其實就是Socket間的通信。
4)數據在兩個Socket間通過IO傳輸