首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Socket 程式設計實戰:點對點與點對多(多執行緒)通訊完整範例

     編輯:Java 相關知識

核心類別速覽

  • InetAddress:IP 位址封裝。
  • Socket:客戶端通訊端點。
  • ServerSocket:伺服端監聽端點。

一、點對點通訊(單客戶端)

伺服端

public class Server {
    private int port;
    public Server(int port) { this.port = port; start(); }

    public String process(String line) { return line.toUpperCase(); }

    public void start() {
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("伺服器啟動,監聽埠:" + port);
            System.out.println("等待客戶連線...");
            try (Socket connection = serverSocket.accept();
                 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                 PrintWriter out = new PrintWriter(connection.getOutputStream(), true)) {

                System.out.println("客戶連線請求...");
                out.println("您好,伺服器連線成功!");
                out.println("輸入 bye 斷開連線");

                String line;
                while ((line = in.readLine()) != null) {
                    System.out.println("收自客戶:" + line);
                    String msg = process(line);
                    out.println("伺服器回應:" + msg);
                    if (line.trim().equalsIgnoreCase("BYE")) break;
                }
            }
        } catch (Exception e) { e.printStackTrace(); }
    }
}

客戶端

public class Client {
    private String host; private int port;
    public Client(String host, int port) { this.host = host; this.port = port; connect(); }

    public void connect() {
        try (Socket connection = host.equals("localhost") ?
                new Socket(InetAddress.getLocalHost(), port) :
                new Socket(InetAddress.getByName(host), port);
             BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
             PrintWriter out = new PrintWriter(connection.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {

            System.out.println("伺服器:" + in.readLine());
            System.out.println("伺服器:" + in.readLine());
            System.out.print("請輸入> ");

            String line;
            while ((line = stdin.readLine()) != null) {
                out.println(line);
                if (line.equalsIgnoreCase("bye")) break;
                System.out.println("伺服器:" + in.readLine());
                if (!line.equalsIgnoreCase("bye")) System.out.print("請輸入> ");
            }
        } catch (IOException e) { System.out.println("連線錯誤:" + e.getMessage()); }
    }
}

二、點對多通訊(多執行緒伺服端)

伺服端主類別(繼承 ServerSocket)

public class Server extends ServerSocket {
    public Server(int port) throws IOException {
        super(port);
        System.out.println("伺服器啟動,監聽埠:" + port);
        try {
            while (true) {
                Socket conn = accept(); // 阻塞等待
                new ServerThread(conn, port); // 每連線一執行緒
            }
        } finally { close(); }
    }
}

處理執行緒

public class ServerThread extends Thread {
    private Socket connection;
    private BufferedReader in;
    private PrintWriter out;

    public ServerThread(Socket s, int port) throws IOException {
        this.connection = s;
        in = new BufferedReader(new InputStreamReader(s.getInputStream(), "GB2312"));
        out = new PrintWriter(s.getOutputStream(), true);
        out.println("您好,伺服器連線成功!");
        out.println("輸入 bye 斷開連線");
        start();
    }

    @Override
    public void run() {
        try {
            String line;
            while ((line = in.readLine()) != null) {
                if (line.trim().equalsIgnoreCase("bye")) break;
                System.out.println("收自客戶:" + line);
                out.println("伺服器回應:" + line.toUpperCase());
            }
            System.out.println("Bye bye!");
        } catch (Exception e) { e.printStackTrace(); }
        finally { try { connection.close(); } catch (IOException ignored) {} }
    }
}

客戶端

與點對點版本相同,無需修改即可連線多執行緒伺服端。

關鍵差異總結

特性點對點點對多(多執行緒)
伺服端處理單一連線,循環讀寫主執行緒 accept(),每連線啟動 ServerThread
並發能力一次只能服務一個客戶可同時服務多個客戶
資源關閉手動 close()建議用 try-with-resources 或 finally 確保釋放

編譯執行提示

# 伺服端
javac server/*.java
java server.ServerDemo 8888

# 客戶端
javac client/*.java
java client.ClientDemo localhost 8888
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved