網絡通訊方式 ------ TCP、UDP

 在現有的網絡中,網絡通訊的方式主要有兩種:

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();


2)接收端

在接收端,要指定監聽的端口。

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傳輸
















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章