Java中經過TCP協議發送和接收數據-Socket編程

TCP

TCP協議是面向鏈接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重複到達)傳輸層協議。編程

TCP經過三次握手創建鏈接,通信完成時要拆除鏈接,因爲TCP是面向鏈接的因此只能用於端到端的通信。服務器

Socket

    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();
        }
     }
}

運行測試:

先運行服務端代碼,以後運行客戶端。

以後能夠分別在客戶端和服務端看到對應的消息。

相關文章
相關標籤/搜索