TCP傳輸控制協議是一種面向連接的,可靠的,基於字節流的傳輸層通信協議。在Java中,TCP程序設計是指利用ServerSocket類和Socket類編寫的網絡通信程序。利用TCP協議進行通信的兩大應用程序是有主次之分的,一個稱爲服務器端程序,另一個稱爲客戶端程序,兩者的功能和編寫方法大不一樣。
1,服務器程序創建一個ServerSocket(服務器端套接字),調用accept()方法等待客戶機來連接
2,客戶端程序創建一個Socket,請求與服務器建立連接
3,服務器接收客戶機的連接請求,同時創建一個新的Socket與客戶端建立連接,服務器繼續等待新的請求
ServerSocket服務器端
java.net包中的ServerSocket類用於表示服務器套接字,其主要功能是等待來自網絡上的“請求”,它可以通過指定的接口來等待連接的套接字。服務器套接字一次可以與一個套接字連接。如果多臺客戶機同時提出連接請求,服務器套接字會將請求連接的客戶機存入列隊中,然後從中去除一個套接字,與服務器新建的套接字連接起來。若請求連接數大於最大容納數,則多出的連接請求被拒絕。隊列的默認大小是50。
ServerSocket類的構造方法都是拋出IOException異常,分別有以下幾種形式。
1,ServerSocket():創建非綁定服務器套接字
2,ServerSocket(int port):創建綁定到特定端口的服務器套接字。
3,ServerSocket(int port,int backlog):利用指定的backlog創建服務器套接字並將其綁定到指定的本地端口號
4,ServerSocket(int port,int backlog,InetAddress bindAddress):使用指定的端口,偵聽backlog和要綁定到的本地IP地址創建服務器。這種情況適用於計算機上有多塊網卡和多個IP地址的情況,用於可以明確規定ServerSocket在哪塊網卡或IP地址上等待客戶的連接請求。
ServerSocket類的常用方法如下表:
使用ServerSocket對象的accept()方法時,會阻塞線程的繼續執行,知道接收到客戶端的呼叫。例如,下面代碼中,如果沒有客戶端呼叫服務器,那麼Sytem.out.println(“連接中”)語句將不會執行。實際操作過程中,如果沒有客戶端請求,accept()方法也沒有發生阻塞,肯定是程序出現了問題,通常是使用了一個還在被其他程序佔用的端口號,ServerSocket綁定沒有成功。
Socket client = server.accept();
System.out.println("連接中");
Socket客戶端
調用ServerSocket類的accept()方法會返回一個和客戶端Socket對象相連接的Socket對象,java.net包中的Socket類用於表示客戶端的套接字,它採用了TCP建立計算機之間的連接,幷包含了Java語言所有對TCP有關的操作方法,如建立連接,傳輸數據,斷開連接等。
Socket類定義了多個構造方法,它們可以根據InetAddress對象或者字符串指定的IP地址和端口號創建實例,其常用的構造方法如下:
1,Socket():通過系統默認類型的SocketImpl創建未連接套接字
2,Socket(InetAddress address,int port):創建一個流套接字並將其連接到指定IP地址的指定端口號。
3,Socket(InetAddress address,int port,InetAddress localAddr,int localPort):創建一個套接字並將其連接到指定遠程地址上的指定遠程端口。
4,Socket(String host,int port):創建一個流套接字並將其連接到 指定主機上的指定端口號。
5,Socket(String host,int port,InetAddress localAddr,int LocalPort):創建一個套接字並將其連接到指定遠程主機上的指定遠程端口。
Socket類的常用方法如下表:
開發TPC網絡程序時,使用服務器端的套接字的accept()方法生成的Socket對象使用getOutputStream()方法獲得的輸出流將指向客戶端Socket對象使用getInputStream()方法獲得的對應輸入流。同樣,使用服務器套接字的accept()方法生成的Socket對象使用getInputStream()方法獲得的輸入流將指向客戶端Socket對象使用getOutputStream()方法獲得的對應輸出流。也就是說當服務器向輸出流寫入信息時,客戶端通過相應的輸入流就可以讀取,反之亦然。
TCP網絡程序實例
這裏我們通過TCP協議實現服務器端和客戶端通信的功能。
服務器端代碼:
客戶端代碼:
我們先啓動服務器端,然後再啓動客戶端
服務器端運行結果:
客戶端運行結果:
當一臺機器上安裝了多個網絡應用程序時,很可能指定的端口號已經被佔用,還可能遇到以前運行良好的網絡程序突然運行不了的情況,這種情況很可能也是由於端口號被別的程序佔用了,此時可以在cmd命令窗口中使用命令netstat -an查看本機已經使用的端口。