通過 Socket 實現 TCP 程式設計入門

言曌發表於2018-03-17

這裡我們通過一個使用者登入的例子來學習基於 TCP 協議的 Socket 通訊。

通過 Socket 實現 TCP 程式設計入門

通過 Socket 實現 TCP 程式設計入門

 

Socket 通訊模型

通過 Socket 實現 TCP 程式設計入門

 

 

Socket通訊步驟

通過 Socket 實現 TCP 程式設計入門

 

ServerSocket 構造器和成員方法

1、ServerSocket 構造方法

通過 Socket 實現 TCP 程式設計入門

 

2、ServerSocket 成員方法

通過 Socket 實現 TCP 程式設計入門

通過 Socket 實現 TCP 程式設計入門

 

Socket 構造器和成員方法

1、Socket 構造器

通過 Socket 實現 TCP 程式設計入門

 

2、Socket 成員方法

通過 Socket 實現 TCP 程式設計入門

通過 Socket 實現 TCP 程式設計入門

通過 Socket 實現 TCP 程式設計入門

 

一個服務端和支援多個客戶端的對話demo

1、server.java

  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.net.InetAddress;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. /**
  7.  *
  8.  * 基於TCP協議的Socket通訊,實現使用者登入
  9.  * 服務端
  10.  * @author 言曌
  11.  * @date 2017/12/4 下午7:37
  12.  */
  13. public class Server {
  14.     public static void main(String args[]) {
  15.         try {
  16.             //1、建立一個服務端Socket,即ServerSocket,指定繫結的埠,並監聽此埠
  17.             ServerSocket serverSocket = new ServerSocket(8888);
  18.             Socket socket = null;
  19.             //記錄客戶端的數量
  20.             int count = 0;
  21.             //2、呼叫accept方法開始監聽,等待客戶端的連線
  22.             System.out.println("***服務端即將啟動,等待客戶端的連線****");
  23.             //迴圈監聽等待客戶端的連線
  24.             while(true) {
  25.                 //呼叫accept()方法開始監聽,等待客戶端的連線
  26.                 socket = serverSocket.accept();
  27.                 //建立一個新的執行緒
  28.                 ServerThread serverThread = new ServerThread(socket);
  29.                 //啟動執行緒
  30.                 serverThread.start();
  31.                 count ++;//統計客戶端的數量
  32.                 System.out.println("客戶端的數量:"+count);
  33.                 InetAddress inetAddress = socket.getInetAddress();
  34.                 System.out.println("當前客戶端的IP:"+inetAddress.getHostAddress());
  35.             }
  36.         } catch (IOException e) {
  37.             e.printStackTrace();
  38.         }
  39.     }
  40. }

 

2、ServerThread.java

  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.net.Socket;
  4. /**
  5.  * 伺服器執行緒處理類
  6.  * @author 言曌
  7.  * @date 2017/12/4 下午8:32
  8.  */
  9. public class ServerThread extends Thread {
  10.     //本執行緒相關的Socket
  11.     Socket socket = null;
  12.     public ServerThread(Socket socket) {
  13.         this.socket = socket;
  14.     }
  15.     //執行緒執行操作,響應客戶端的請求
  16.     public void run() {
  17.         InputStream inputStream = null;//字元輸入流
  18.         InputStreamReader inputStreamReader = null;
  19.         BufferedReader bufferedReader = null;
  20.         OutputStream outputStream = null;
  21.         PrintWriter printWriter = null;
  22.         try {
  23.             //獲取輸入流,並讀取客戶端資訊
  24.             inputStream = socket.getInputStream();
  25.             inputStreamReader = new InputStreamReader(inputStream);//將位元組流轉換成字元流
  26.             bufferedReader = new BufferedReader(inputStreamReader);//為字元流新增快取
  27.             String info = null;
  28.             while((info = bufferedReader.readLine()) != null) {
  29.                 System.out.println("我是伺服器,客戶端說:"+info);
  30.             }
  31.             socket.shutdownInput();//關閉輸入流
  32.             //獲取輸出流,響應客戶端的請求
  33.             outputStream = socket.getOutputStream();
  34.             printWriter = new PrintWriter(outputStream);
  35.             printWriter.write("歡迎您!");
  36.             printWriter.flush();//重新整理快取
  37.         } catch (IOException e) {
  38.             e.printStackTrace();
  39.         } finally {
  40.             //關閉資源
  41.             try {
  42.                 if(bufferedReader != null) {
  43.                     bufferedReader.close();
  44.                 }
  45.                 if(outputStream != null) {
  46.                     outputStream.close();
  47.                 }
  48.                 if(inputStreamReader != null) {
  49.                     inputStreamReader.close();
  50.                 }
  51.                 if(inputStream != null) {
  52.                     inputStream.close();
  53.                 }
  54.                 if(socket != null) {
  55.                     socket.close();
  56.                 }
  57.             } catch (IOException e) {
  58.                 e.printStackTrace();
  59.             }
  60.         }
  61.     }
  62. }

 

3、Client.java

  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.net.Socket;
  4. /**
  5.  * 客戶端
  6.  * @author 言曌
  7.  * @date 2017/12/4 下午7:37
  8.  */
  9. public class Client {
  10.     public static void main(String args[]) {
  11.         try {
  12.             //1、建立客戶端Socket,指定伺服器地址和埠
  13.             Socket socket = new Socket("localhost",8888);
  14.             //2、獲取輸出流,向伺服器端傳送資訊
  15.             OutputStream outputStream = socket.getOutputStream();//位元組輸出流
  16.             PrintWriter printWriter = new PrintWriter(outputStream);//將輸出流包裝為列印流
  17.             printWriter.write("使用者名稱:Tom;密碼:123456");
  18.             printWriter.flush();//重新整理快取,輸出資訊
  19.             socket.shutdownOutput();//關閉輸出流
  20.             //3、獲取輸入流,並讀取伺服器的響應資訊
  21.             InputStream inputStream = socket.getInputStream();
  22.             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  23.             String info = null;
  24.             while((info = bufferedReader.readLine()) != null) {
  25.                 System.out.println("我是客戶端,伺服器說:"+info);
  26.             }
  27.             //4、 關閉資源
  28.             printWriter.close();
  29.             bufferedReader.close();
  30.             inputStream.close();
  31.             outputStream.close();
  32.             socket.close();
  33.         } catch (IOException e) {
  34.             e.printStackTrace();
  35.         }
  36.     }
  37. }

 

上面的程式支援一個服務端和多個客戶端對話。

執行效果

1、先執行 Server 類

通過 Socket 實現 TCP 程式設計入門

 

2、再執行 Client 類

服務端介面

通過 Socket 實現 TCP 程式設計入門

 

客戶端介面

通過 Socket 實現 TCP 程式設計入門

 

3、再執行一次 Client 類,再啟動一個客戶端

服務端介面

通過 Socket 實現 TCP 程式設計入門

 

客戶端介面如上

 

 

本文參考:慕課網

本文地址:https://liuyanzhao.com/6907.html

相關文章