天天看點

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

        }

     }

}

運作測試:

先運作服務端代碼,之後運作用戶端。

之後可以分别在用戶端和服務端看到對應的消息。