Socket網路程式設計(備忘)
一、概述
基於TCP協議的Socket程式設計體驗之 ——線上客戶系統使用者登入 |
1、Socket簡介 |
2、Socket通訊原理 |
|
3、Socket類以及ServerSocket類如何使用 |
|
4、InetAddress類如何使用 |
|
基於UDP協議的Socket程式設計體驗之 ——線上客戶系統客戶諮詢 |
1、DatagramSocket類如何使用 |
2、DatagramPacket類如何使用 |
1、TCP:Transmission Control Protocol傳輸控制協議,TCP是一種面向連線(連線導向)的、可靠的、基於位元組流的運輸層(Transport layer)通訊協議,由IETF的RFC 793說明(specified)。在簡化的計算機網路OSI模型中,它完成地四層傳輸層所指定的功能。
類似於撥打電話,使用該種方式進行網路通訊時,需要建立專門的虛擬連線,然後進行可靠的資料傳輸,如果資料傳送失敗,則客戶端會自動重發該資料。
2、UDP:User Datagram Protocol的簡稱,中文名是使用者資料報協議,是OSI參考模型中的一種無連線的傳輸層協議,提供面向事物的簡單不可靠資訊傳送服務,IETF RFC 768是UDP的正式規範。
UDP類似於傳送簡訊,使用這種方式進行網路通訊時,不需要建立專門的虛擬連線,傳輸也不是很可靠,如果傳送失敗則客戶端無法獲得。
3、總結:
這兩種傳輸方式都是實際的網路程式設計中進行使用,重要的資料一般使用TCP方式進行資料傳輸,而大量的非核心資料
4、區別:
TCP |
UDP |
由於它是一個面向連線的協議,在Socket之間進行資料傳輸之前必然要建立連線,所以在TCP中多了一個連線建立的時間。 |
使用UDP時,每個資料報中都給出了完整的地址資訊,因此無需要建立傳送方和接收方的連線 |
TCP沒有這方面的限制,一旦連線建立起來,雙方的socket就可以按統一的格式傳輸大量的資料 |
使用UDP傳輸資料時時有大小限制的,每個被傳輸的資料報必須限定在64KB之內。 |
TCP在網路同心上有極強的生命力,例如遠端連線(Telnet)和檔案傳輸(FTP)都需要不定長度的資料被可靠地傳輸 |
相比之下,UDP操作簡單,而且需要較少的監護,因此通常用於區域網高可靠性的分散系統中的client/server應用程式 |
TCP是一個可靠的協議,它確保接收方完全正確地獲取傳送方所傳送的全部資料 |
UDP是一個不可靠的協議,傳送方所傳送的資料報並不一定以相同的次序到達接收方。 |
二、學習方法
1、瞭解Socket的概念、起源、分類等相關知識,只需要聽懂並看懂課件中的內容即可。
2、Socket通訊原理以及Socket類、ServerSocket類的使用是重點內容
瞭解DatagramSocket類、DatagramPacket類的使用,看懂並完成任務即可
三、Socket
1、簡介:
套接字;應用程式通過“套接字”向網路發出請求或者應答網路請求;
最早是UNIX上的一套網路程式通訊的標準;已被廣泛移植到其它平臺;
Socket實質上提供了程序通訊的端點,網路上的兩個程式通過一個雙向的通訊鏈路實現資料的交換,這個雙向鏈路的一端稱為一個Socket。
Socket封裝了應用層和傳輸層的功能,不需要我們自己去實現。
實際上Socket就相當於我們現實生活的一個插座,我們根據我們需要的來選取合適的插座。
2、分類:
一共有三類:
(1)流式套接字(SOCK_STREAM):提供了一個面向連線,可靠的資料傳輸服務,資料無差錯、五重複的傳送,且按傳送順序接收,其實它對應使用的是TCP協議。
(2)資料報式套接字(SOCK_DGRAM):無連線服務,資料報以獨立包形式被髮送,不提供無差錯保證,資料可能丟失或重複,並且接收順序無序,其實它對應使用的是UDP協議。
(3)原始式套接字(SOCK_RAM):該介面允許對較低層次協議,如IP直接訪問。可以接受本機網絡卡上的資料幀或資料包,對監聽網路流量和分析很有用。
我們主要是學習流式套接字和資料報式套接字。
3、Socket通訊原理概述
就相當於打電話一樣
四、基於TCP協議的Socket程式設計
相關的類是Socket類、ServerSocket類,都被封裝在java.net包中
1、Socket類
(1)Socket類的構造方法
構造方法 |
說明 |
Socket(String host,int port) |
向host主機的port埠發起連線請求 |
Socket(String host,int port,InetAddress localAddr,int localPort) |
向host主機的port埠發起連線請求,發起請求的計算機為localAddr,埠為localPort |
InetAddress類表示網際網路協議地址,包含IP地址,InetAddress類是java對IP地址的封裝。
(2)Socket類的常用方法
常用方法 |
說明 |
InetAddress getInetAddress() |
返回與當前Socket物件關聯的InetAddress物件 |
void shutdownInput() |
此套接字的輸入流置於“流的末尾” |
void shutdownOutput() |
禁用此套接字的輸出流 |
InputStream getInputStream() |
返回當前Socket物件關聯的InputStream物件,它是伺服器端向客戶端傳送回來的資料流。 |
OutputStream getOutputStream() |
返回當前Socket物件關聯的OutputStream物件,它是客戶端向伺服器端傳送的資料流。 |
Void close() |
關閉該Socket物件建立的連線 |
2、ServerSocket類
(1)ServerSocket類的構造方法
構造方法 |
說明 |
ServerSocket() |
建立一個ServerSocket物件。 |
ServerSocket(int port) |
建立一個ServerSocket物件,並繫結到繫結的埠。 |
(2)ServerSocket類的常用方法
常用方法 |
說明 |
Socket accept() |
偵聽並接收到此ServerSocket的連線,此方法在連線傳入之前一直阻塞。 |
void close() |
是伺服器釋放佔用的資源,並斷開所有客戶端的連線。 |
InetAddress getInetAddress() |
返回當前伺服器繫結的IP地址資訊。 |
3、例項
(1)使用者登入——字串方式
Server(伺服器端) |
1、建立一個伺服器端的Socket(ServerSocket),指定繫結埠,並等待監聽; 2、使用accept()方法來阻塞等待監聽,獲取新的連線;(實際上就是通過該方法獲取Socket物件); 3、獲取Socket的輸入輸出流,進行操作(讀取並響應客戶端請求); 4、關閉資源。 |
Client(客戶端) |
1、建立Socket物件,與伺服器建立連線; 2、獲取輸入輸出流,進行操作(給伺服器端傳送請求並獲取伺服器端的響應資訊); 3、關閉資源 |
注意:方法shutdownOutput()和方法shutdownInput(),在客戶端傳送請求後,使用這兩個方法,才能夠完成整個的通訊(即C與S都進行了請求相關的操作),如果沒有這個兩個方法中的一個,則整個通訊就沒完成。但是兩個方法所得到的結果是不一樣的。
(2)使用者登入——物件方式
實際過程跟字串方式差不多,但是要注意:
① 就是操作物件的流與操作字串的流是不一樣的。操作字串的讀寫流我們用的是BufferedReader/PriteWriter,操作物件的讀寫流我們用的是ObjectInputStream/ObjectOutputStream;
② 還有一點就是要注意我們操作的物件必須是實現了序列化的才行,不然會報錯。
(3)使用者登入——多客戶端
建立一個執行緒類,放到Server端,就可以實現多個Client訪問該Server了。
(4)伺服器獲取客戶端的IP資訊
4、總結(Socket程式設計步驟)
Server(伺服器端) |
1、建議一個伺服器Socket(ServerSocket)繫結指定埠並開始監聽; 2、使用accept()方法阻塞等待監聽,獲得新的連線; 3、建立輸入和輸出流; 4、在已有的協議上產生會話; 5、使用close()關閉資源。 |
Client(客戶端) |
1、建立客戶端Socket連線,指定伺服器的位置以及埠; 2、得到Socket的讀寫流; 3、利用流按照一定的協議對Socket進行讀寫操作; 4、使用close()關閉資源。 |
5、Socket通訊原理詳解
6、InetAddress類
如何在伺服器端獲取每個客戶端的IP地址呢?
思路:
(1)InetAddress類:表示網際網路協議地址,包含IP地址,是Java對IP地址的封裝,它可以通過Socket的getAddress()方法獲得。
(2)java.net.InetAddress類的常用方法:
常用方法 |
說明 |
getHostAddress() |
返回IP地址字串(以文字表現形式); |
getHostName() |
獲得此IP地址的主機名。 |
五、基於UDP協議的Socket程式設計
1、基於UDP協議的Socket(資料報式套接字)
基於UDP協議;無連線;透出資料包快遞高速;資料安全性不佳。
比如:網路遊戲,視訊會話,QQ聊天資訊
2、類
DatagramSocket類:傳送和接收資料包的套接字,不維護連線狀態,不產生輸入輸出流;
DatagramPacket類:資料包,封裝了資料、資料長度、目標地址和目標埠。
注意:客戶端要向外傳送資料,必須首先建立一個DatagramPacket的物件,再使用DatagramSocket物件傳送。
3、DatagramPacket類:
構造方法 |
說明 |
DatagramPacket(byte[]buf,int length,InetAddress address,int port) |
構造DatagramPacket物件,用來將長度為length的包傳送到指定主機上的指定埠號。 |
DatagramPacket(byte[]buf,int length) |
構造DatagramPacket,用來接收長度為length的資料包。 |
DatagramPacket(byte[]buf,int length,SocketAddress sa) |
構造資料報包,用來將長度為length的包傳送到指定主機上的指定埠號。 |
4、DatagramSocket類
構造方法 |
說明 |
DatagramSocket() |
建立一個DatagramSocket物件,並將其與本地主機上任何可用的埠繫結。 |
DatagramSocket(int port) |
建立一個DatagramSocket物件,並將其與本地主機上的指定埠繫結。 |
常用方法 |
說明 |
void send(DatagramPacket p) |
傳送指定的資料報 |
void receive(DatagramPacket p) |
接收資料報,手打資料以後,存放在指定的DatagramPacket物件中 |
void close() |
關閉當前DatagramSocket物件 |
5、例子——線上客服系統客戶諮詢
用DatagramSocket來傳輸資料,而傳輸的資料是以資料報包(DatagramPacket)的形式存在的,基本的程式設計過程為:
Server(伺服器) |
Client(客戶端) |
1、建立接收方(伺服器端)的套接字,也就是DatagramSocket物件; 2、建立接收型別的資料報包(其中資料報包中的資料是以位元組陣列的形式存在的); 3、通過套接字(DatagramSocket)來接收資料報包(也就是客戶端的請求資訊); 4、響應客戶端的請求,把資料(響應資訊)包裝在資料報包中; 5、傳送響應給客戶端(響應客戶端的請求); 6、釋放資源。 |
1、建立傳送方(客戶端)的套接字; 2、建立傳送的請求(客戶端的請求)資料的資料報包,包括請求的資訊、伺服器地址以及埠號; 3、傳送請求給伺服器; 4、接收伺服器的響應資訊的資料報包; 5、通過套接字接收伺服器的響應; 6、釋放資源。 |