TCP協議是面向鏈接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重複到達)傳輸層協議。編程
TCP經過三次握手創建鏈接,通信完成時要拆除鏈接,因爲TCP是面向鏈接的因此只能用於端到端的通信。服務器
Socket能夠說是一種針對網絡的抽象,應用經過它能夠來針對網絡讀寫數據。根據TCP協議和UDP協議的不一樣,在網絡編程方面就有面向兩個協議的不一樣socket,一個是面向字節流的一個是面向報文的。網絡
對socket的自己組成卻是比較好理解。既然是應用經過socket通訊,確定就有一個服務器端和一個客戶端。因此它必然就包含有一個對應的IP地址。另外,在這個地址上server要提供一系列的服務,因而就須要有一系列對應的窗口來提供服務。因此就有一個對應的端口號(Port)。socket
Socket服務端測試
Server端所要作的事情主要是創建一個通訊的端點,而後等待客戶端發送的請求。典型的處理步驟以下:spa
1. 構建一個ServerSocket實例,指定本地的端口。這個socket就是用來監聽指定端口的鏈接請求的。server
2.重複以下幾個步驟:htm
a. 調用socket的accept()方法來得到客戶端的鏈接請求。經過accept()方法返回的socket實例,創建了一個和客戶端的新鏈接。ci
b.經過這個返回的socket實例獲取InputStream和OutputStream,能夠經過這兩個stream來分別讀和寫數據。get
c.結束的時候調用socket實例的close()方法關閉socket鏈接。
服務端示例代碼:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public
class
TestTCPSend { public static void main( String [] args) { ServerSocket serverSocket=null; Socket socket=null; String msg= "hello client,I am server.." ; try { //構造ServerSocket實例,指定端口監聽客戶端的鏈接請求 serverSocket= new ServerSocket( 8080 ); //創建跟客戶端的鏈接 socket=serverSocket.accept(); //向客戶端發送消息 OutputStream os=socket.getOutputStream(); os.write(msg.getBytes()); InputStream is=socket.getInputStream(); //接受客戶端的響應 byte [] b= new byte [ 1024 ]; is.read(b); System.out.println( new String (b)); } catch (IOException e) { e.printStackTrace(); } finally { //操做結束,關閉socket try { serverSocket.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
Socket客戶端
客戶端的請求過程稍微有點不同:
1.構建Socket實例,經過指定的遠程服務器地址和端口來創建鏈接。
2.經過Socket實例包含的InputStream和OutputStream來進行數據的讀寫。
3.操做結束後調用socket實例的close方法,關閉。
服務端示例代碼:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public
class
TestTCPReceive { public static void main( String [] args) { Socket socket=null; try { //對服務端發起鏈接請求 socket= new Socket( "localhost" , 8080 ); //接受服務端消息並打印 InputStream is=socket.getInputStream(); byte b[]= new byte [ 1024 ]; is.read(b); System.out.println( new String (b)); //給服務端發送響應信息 OutputStream os=socket.getOutputStream(); os.write( "yes,I have received you message!" .getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
運行測試:
先運行服務端代碼,以後運行客戶端。
以後能夠分別在客戶端和服務端看到對應的消息。