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


TCP

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

TCP通過三次握手建立連接,通訊完成時要拆除連接,由於TCP是面向連接的所以只能用於端到端的通訊。

Socket

    Socket可以說是一種針對網絡的抽象,應用通過它可以來針對網絡讀寫數據。根據TCP協議和UDP協議的不同,在網絡編程方面就有面向兩個協議的不同socket,一個是面向字節流的一個是面向報文的。

   對socket的本身組成倒是比較好理解。既然是應用通過socket通信,肯定就有一個服務器端和一個客戶端。所以它必然就包含有一個對應的IP地址。另外,在這個地址上server要提供一系列的服務,於是就需要有一系列對應的窗口來提供服務。所以就有一個對應的端口號(Port)。

Socket服務端

Server端所要做的事情主要是建立一個通信的端點,然后等待客戶端發送的請求。典型的處理步驟如下:

1. 構建一個ServerSocket實例,指定本地的端口。這個socket就是用來監聽指定端口的連接請求的。

2.重復如下幾個步驟:

  a. 調用socket的accept()方法來獲得客戶端的連接請求。通過accept()方法返回的socket實例,建立了一個和客戶端的新連接。

  b.通過這個返回的socket實例獲取InputStream和OutputStream,可以通過這兩個stream來分別讀和寫數據。

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

運行測試:

先運行服務端代碼,之后運行客戶端。

之后可以分別在客戶端和服務端看到對應的消息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM