[英]Socket Multithreading - Reading input stream pauses thread
我正在測試本地機器上的套接字。 我正在嘗試使用線程在一個程序中運行套接字和服務器。 我的服務器是一個echo服務器,因此它會發回它收到的任何消息。 我的問題是,當我在客戶端和服務器上啟動兩個線程時,當它們到達我從輸入流中讀取的部分時,它們會“凍結”。 它適用於客戶端發送消息的部分。 之后,它只是停止,因為看起來客戶端正在等待消息,即使我已經通過寫入輸出流向服務器發送消息,服務器也是如此。 代碼有什么問題?
Client.java
@Override
public void run() {
try {
Socket socket = new Socket("localhost", 22600);
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
BufferedReader input = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("Client 1");
while (true) {
System.out.print("\nEnter text : ");
String inputText = input.readLine();
writer.write(inputText);
System.out.println("Client 2");
System.out.println("Client 3");
String s = br.readLine();
System.out.println("CLIENT RECEIVED : " + s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Server.java
@Override
public void run() {
try {
ServerSocket server = new ServerSocket(22600);
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
System.out.println("Server 1");
while (true) {
System.out.println("Server 2");
String s = br.readLine();
System.out.println("Server 3");
if (s == null) {
System.out.println("NULL SERVER SIDE ERROR");
break;
}
writer.write("ECHO : " + s);
System.out.println("SYSOUT ECHO " + s);
}
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
您正在編寫一個字符串,其末尾沒有行尾。
String inputText = input.readLine();
writer.write(inputText);
System.out.println("Client 2");
inputText
字符串不包括您鍵入的行尾。 然后你按原樣把它寫到服務器上。 但是,服務器嘗試讀取一行:
String s = br.readLine();
System.out.println("Server 3");
所以它會一直等到客戶端發送換行符。 但到目前為止,客戶端正在等待服務器的回答,現在它們已陷入僵局。
因此,您應該將writer.newLine()
添加到客戶端,以及服務器的echo,它會遇到同樣的問題。 在每次寫入之后,還建議在服務器和客戶端上使用writer.flush()
。 否則,它可能會等到緩沖區已滿,然后才會實際寫入,並導致相同的死鎖。
BufferedReader的readLine
方法需要一個新的行終止符來返回一個值(除非到達Stream的末尾),然后返回沒有該字符的行。 所以客戶
inputText
inputText
寫入OutputStream 如果您希望使用新行作為通信分隔符,請將其附加到發送數據的末尾
writer.write(inputText + "\n");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.