? Socket通信作為Java網(wǎng)絡通訊的基礎內(nèi)容,建立網(wǎng)絡通信連接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供做網(wǎng)絡開發(fā)所用的接口,這就是Socket編程接口。
? Socket通信分為基于TCP的Socket通信(使用流式套接字,提供可靠、面向連接的通信流)以及基于UDP的Socket通信(使用數(shù)據(jù)報套接字,定義一種無連接服務)。
編程實現(xiàn)步驟如下:
1)服務器端創(chuàng)建其提供服務的端口號,即服務器端中提供服務的應用程序接口名稱。
服務器端ServerSocket:ServerSocket serverSocket =newServerSocket(intport,intbacklog);ServerSocket作用是向操作系統(tǒng)注冊相應協(xié)議服務,申請端口并監(jiān)聽這個端口是否有鏈接請求。其中port是端口號,backlog是服務器最多允許鏈接的客戶端數(shù)。注冊完成后,服務器分配此端口用于提供某一項進程服務。
2)服務器端(Server)和客戶端(Client)都創(chuàng)建各自的Socket對象。
服務器端Socket:Socket socket = serverSocket.accept();服務器端創(chuàng)建一個socket對象用于等待客戶端socket的鏈接(accept方法是創(chuàng)建一個阻塞隊列,只有客戶端socket申請鏈接到服務器后,服務器端socket才能收到消息) 。如果服務器端socket收到客戶端的鏈接請求,那么經(jīng)過"三次握手"過程,建立客戶端與服務器端的連接。如果連接不成功,則拋出異常(詳見模塊三)。
客戶端Socket:Socket socket =newSocket(String host,intport);客戶端創(chuàng)建按一個socket對象用于鏈接具體服務器host的具體服務端口port,用于獲得服務器進程的相應服務。
經(jīng)過三次握手后,一個Socket通路就建立起來。此時,服務器端和客戶端就可以開始通訊了。
3)服務器端和客戶端打開鏈接到Socket通路的I/O流,按照一定協(xié)議進行數(shù)據(jù)通信。
協(xié)議就是指發(fā)送與接受數(shù)據(jù)的編碼格式(計算機網(wǎng)絡中為:語義、同步)。簡單說就是輸入和輸出的流必須匹配。
開啟網(wǎng)絡輸入流:網(wǎng)絡輸入流指的是從socket通道進入計算機內(nèi)存的流。socket.getInputStream();返回值InputStream 輸入字節(jié)流
開啟網(wǎng)絡輸出流:網(wǎng)絡輸出流指的是從計算機內(nèi)存走出到socket通道的流。socket.getOutputStream();返回值OutputStream 輸出字節(jié)流,為了通訊方便,往往將低級流包裝成高級流進行服務端與客戶端之間的交互。
4)通信完畢,關閉網(wǎng)絡流
一般而言,服務器端的流是不用關閉的,當然在某些條件下(比如服務器需要維護)也是需要關閉的。而客戶端一般都需要關閉。