1. 程式人生 > 其它 >[java][bio][多客戶端 - 伺服器示例程式碼]

[java][bio][多客戶端 - 伺服器示例程式碼]

技術標籤:Java

B站視訊

https://www.bilibili.com/video/BV1kT4y1M7vt?p=8
在這裡插入圖片描述

伺服器端程式碼

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //註冊埠
        try (ServerSocket serverSocket = new ServerSocket
(9999)) { //定義一個死迴圈,負責不斷接收客戶端的Socket連結請求 while (true){ Socket socket = serverSocket.accept(); //建立一個獨立的執行緒來處理與這個客戶端的socket通訊請求 new Thread(new ServerRunnableReader(socket)).start(); } } } }

執行緒程式碼

import java.
io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; /** * 此處的實現與視訊中老師的實現有區別: * 個人認為繼承Thread的實現並不好,實現Runnable介面更好一些 * 借用《論語》的一句話來說,就是:擇其善者而從之,其不善者而改之。 * 雖然是個簡單示例的例子,但是在自己意識到的範圍內勁量保持良好的程式碼規範。 */ public class ServerRunnableReader
implements Runnable { private Socket socket; public ServerRunnableReader(Socket socket) { this.socket = socket; } @Override public void run() { try { //得到輸入流 InputStream is = socket.getInputStream(); //得到緩衝字元流,此處用到裝飾者模式,每裝飾一次,增強一個功能。 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String msg; while ((msg = br.readLine()) != null){ System.out.println(msg); } } catch (IOException e) { e.printStackTrace(); } } }

客戶端程式碼

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        //1.請求與伺服器端Socket物件連結
        //資源類放到try裡的寫法,是Java引入的新特性
        try (Socket socket = new Socket("127.0.0.1", 9999)) {
            //得到一個列印流
            PrintStream ps = new PrintStream(socket.getOutputStream());
            //使用迴圈不斷的傳送訊息給服務端接收
            while (true){
                Scanner scanner = new Scanner(System.in);
                System.out.print("請說");
                String msg = scanner.nextLine();
                ps.println(msg);
                ps.flush();
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}