[java][bio][多客戶端 - 伺服器示例程式碼]
阿新 • • 發佈:2021-01-31
技術標籤: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();
}
}
}