首先,我想介紹一下我當前的代碼:
/**
App.java:
**/
package org.example;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class App
{
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(2343);
} catch (IOException e) {
System.err.println("Could not listen on 2343");
}
try {
while (true) {
Socket clientSocket = serverSocket.accept();
try {
new Helper(clientSocket);
} catch (IOException e) {
clientSocket.close();
}
}
} finally {
serverSocket.close();
}
}
}
/**
Helper.java:
**/
package org.example;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Helper extends Thread {
public static BufferedReader br;
public static BufferedWriter bw;
public static String output = "";
public Helper(Socket socket) throws IOException {
System.out.println("user found");
br = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8));
start();
}
@Override
public void run() {
while (true) {
try {
bw.write("set");
bw.newLine();
bw.flush();
System.out.println(br.readLine() "\n" getId());
} catch (IOException e) {
System.out.println("Client Lost");
break;
}
}
}
}
/**
Cli.java
**/
package org.example2;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
class Cli {
public static void main(String[] argv) throws Exception {
BufferedWriter bw;
Socket clientSocket;
BufferedReader br;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
clientSocket = new Socket("laith.com.au", 2343);
bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream(), StandardCharsets.UTF_8));
br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8));
while(true){
String input=br.readLine();
bw.write(inFromUser.readLine());
bw.newLine();
bw.flush();
}
}
}
其次,我將顯示輸出:
應用程式.java
user found
hello world
13
hello world
13
user found
hello world
14
hello world
14
hello world
13
Client Lost
Client Lost
Cli.java (no1 所有用戶輸入)
hello world
hello world
hello world
hello world
Cli.java (no2 所有用戶輸入)
hello world
hello world
成績單:
我啟動應用程式:
我開始 Cli 的第一個實體: user found
我在 Cli no1 中輸入“hello world”:(hello world換行)13
我再次在 Cli no1 中輸入“hello world”:(hello world換行)13
我開始 Cli 的第二個實體: user found
我在 Cli no2 中輸入“hello world”:(hello world換行)14
我再次在 Cli no2 中輸入“hello world”:(hello world換行)14
我在 Cli no1 中輸入“hello world” :(hello world換行)13
我再次在 Cli no1 中輸入“hello world”:
我終止 Cli no1:
我終止 Cli no2:(Client Lost換行)Client Lost
最后問題:
為什么,每當我添加另一個客戶端以連接到服務器時,舊客戶端只能在服務器停止回應之前再發送一條訊息。
uj5u.com熱心網友回復:
那是因為br和bw在Helper類中被宣告為static.
static 意味著該欄位由類的所有實體共享。
結果,當Helper為您的第二個客戶端創建第二個實體時,這些實體共享br并被bw這個新連接的讀取器和寫入器覆寫 => 即之后,兩個Helper執行緒都從這個新連接讀取和寫入。
您會看到來自舊客戶端的另一個寫入,因為當br和bw被覆寫時,舊Helper執行緒已經在內部等待br.readLine()來自第一個客戶端的傳入字串。
老Helper執行緒讀取的新的價值觀br和bw后,才到達行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/345042.html
