下面會使用簡單的客戶機/伺服器應用程式來分別演示使用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...