TCP和UDP套接字程式設計

2021-06-28 12:01:26 字數 3966 閱讀 2086

下面會使用簡單的客戶機/伺服器應用程式來分別演示使用tcp套接字程式設計和udp套接字程式設計。

先說明一下,實現的功能:

(1)一台客戶機從鍵盤讀取一行字元,並通過連線的套接字傳送給伺服器

(2)伺服器從套接字讀取該行字元

(3)伺服器將該行字元的小寫字元,轉換成大寫字元

(4)伺服器將轉換後的字元通過連線的套接字返回給客戶機

(5)客戶機從其套接字讀取轉換後的字元後,通過監視器列印出來。

下面先看一下tcp套接字程式設計:

tcpserver:

public class tcpserver 

}}

serversocket welcomesocket = new serversocket(6789);
通常我們把socket當作一扇門,而這一句則是監聽某客戶機「敲門」聲的門,而且是在6789埠上監聽。

socket connectionsocket = welcomesocket.accept();

這句表示,當某客戶機「敲門」時,則建立乙個新的套接字。這時,connectionsocket已經和客戶機某socke建立了虛擬管道,它們都可以通過其傳送直接。 

bufferedreader isfromclient = new bufferedreader(new inputstreamreader(connectionsocket.getinputstream()));
clientsentence = isfromclient.readline();
這兩行則讀取了客戶機的輸入。

modifiedsentence = clientsentence.touppercase()+'\n';
這一行完成了將客戶機發來的字元,轉換成大寫字元

dataoutputstream outtoclient = new dataoutputstream(connectionsocket.getoutputstream());
outtoclient.writebytes(modifiedsentence);
這兩行則往客戶機返回資料。

tcpclient:

public class tcpclient 

}

bufferedreader isfromuser = new bufferedreader(new inputstreamreader(system.in));
sentence = isfromuser.readline();

這兩行是讀取使用者從鍵盤上輸入的東西,並轉換成字串型別,放在sentence。 

socket clientssocket = new socket(inetaddress.getlocalhost(), 6789);
建立了與伺服器連線的socket,通過該行也發起了客戶機和伺服器間的tcp連線。由於本次測試是在客戶機,伺服器都是本主機,所以ip位址是inetaddress.getlocalhost(),即本地ip位址。6789表示連線伺服器上的埠號。

dataoutputstream outtoserver= new dataoutputstream(clientssocket.getoutputstream());
outtoserver.writebytes(sentence+'\n');
這兩行是把使用者輸入的文字傳送到伺服器上。

bufferedreader isfromserver = new bufferedreader(new inputstreamreader(clientssocket.getinputstream()));
modifiedsentence = isfromserver.readline();
system.out.println("from server:" + modifiedsentence);
這三行是讀取伺服器返回的資訊,並列印在監視器上。

clientssocket.close();
該行關閉了套接字,因此客戶機和伺服器之間的tcp連線也同時被關閉。這一行會引起客戶機向伺服器傳送運輸層報文。

注意這裡應該先執行編譯好的伺服器程式,在執行客戶機的程式,結果如下:

假設輸入為abc

abc

from server:abc

然後用udp套接字程式設計實現同樣的功能:

udpserver:

public class udpserver 

}}

datagramsocket serversocket = new datagramsocket(9999);
該行在埠9999構造了datagramsocket物件,應該注意到這用到的套接字與tcp不一樣。因為udp是無連線的,所以當接受時,沒有必要像tcp那樣產生乙個新的套接字並繼續監聽請求。如果有多個客戶機訪問該伺服器端口,都將往這個單一的門傳送分組。

datagrampacket receivepacket = new datagrampacket(receivedata,receivedata.length);

serversocket.receive(receivepacket);

string sentence = new string(receivepacket.getdata());

這幾行是讀取客戶機傳送過來的資料,並放在sentence上。

inetaddress ipaddress = receivepacket.getaddress();
int port = receivepacket.getport();

這一行是獲取客戶機的ip位址和埠。以便給客戶機返回資料。 

datagrampacket senddatagrampacket = new datagrampacket(senddata,senddata.length, ipaddress, port);

serversocket.send(senddatagrampacket);

這兩行則是把轉換結果傳送給客戶機。注意該分組應該包含ip位址與埠。

udpclient:

public class udpclient 

}

datagramsocket clientsocket = new datagramsocket(11111);
該行,是為udp套接字指派了乙個特定的埠號11111,當然也可以不指定埠號,則不填引數即可,這時,運輸層自動為該套接字分配乙個尚未使用的埠號。

datagrampacket sendpacket = new datagrampacket(senddata, senddata.length, inetaddress.getlocalhost(), 9999);
該行構件了乙個分組,包含資料,資料長度,伺服器ip位址(因為本測試在本主機執行,所以用本地ip位址),以及埠號

clientsocket.close();
關閉套接字,因為udp無連線的,所以不會引起客戶機向伺服器傳送運輸層報文。

UDP套接字程式設計

與面向連線的協議相比,面向無連線協議極為不同。其中乙個重要的不同點就是客戶端與伺服器之間不必建立連線。對於udp套接字程式設計而言,伺服器建立套接字後,呼叫bind 函式將套接字與準備接收資料的介面繫結在一起。和tcp程式設計不同的是,應用程式不必呼叫listen 和accept 函式等待客戶端的連...

UDP套接字程式設計

udp是使用者資料報協議,與tcp協議一樣,在網路中處理資料報,是一種無連線的傳輸層協議,具有不可靠性,udp有不提供資料報分組 組裝和不能對資料報進行排序的缺點,也就是說,當報文傳送之後,是無法得知其是否安全完整到達的。基於udp的客戶端伺服器 伺服器 include include includ...

TCP套接字程式設計

網路程式設計又稱為套接字程式設計,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而程式設計中的 套接字 就是用來連線該網路的工具。它本身具有連線的含義,還可以表示為兩台計算機之間的網路連線。4.呼叫accept函式受理連線請求 基於tcp的服務端 客戶端 tcp伺服器端預設函式呼叫順序 sock...