客户端主动等待,同时从服务器侦听
Client active wait while listening from server
您好,我正在 java 中编写一个小应用程序 client/server。我需要客户端永久监听服务器,所以我想出了一个涉及线程的解决方案,这里是代码
package ClientCommunication;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Listen extends Thread {
String fromServer;
Socket kkSocket;
boolean connected = true;
Listen(Socket mysocket) {
this.kkSocket = mysocket;
}
@Override
public void run() {
while (connected) {
fromServer = null;
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
} catch (IOException ex) {
connected=false;
Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex);
}
try {
while (fromServer == null) {
fromServer = in.readLine();
}
} catch (IOException ex) {
connected=false;
Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Received from Thread: " + fromServer);
}
}
}
我不知道这样做是否是一个好的做法,我觉得不是"elegant",所以你能帮我一个更好的解决方案吗?
所以您的代码有以下不足之处:
- 您在每次读取时重新创建输入流。
- 你的 nested while 没用,fromServer 在第二次迭代时永远不会为 null。它只会挂起,直到数据被流式传输。 (这与从文件读取不同,明白吗?)
现在呢?去掉outerwhile循环,在内循环中将条件改为true(无限);它只会在异常时终止。
还有一点,把print语句移到while里面,不然不会只在异常后才调用
希望这能让您理清思路。
您好,我正在 java 中编写一个小应用程序 client/server。我需要客户端永久监听服务器,所以我想出了一个涉及线程的解决方案,这里是代码
package ClientCommunication;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Listen extends Thread {
String fromServer;
Socket kkSocket;
boolean connected = true;
Listen(Socket mysocket) {
this.kkSocket = mysocket;
}
@Override
public void run() {
while (connected) {
fromServer = null;
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
} catch (IOException ex) {
connected=false;
Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex);
}
try {
while (fromServer == null) {
fromServer = in.readLine();
}
} catch (IOException ex) {
connected=false;
Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Received from Thread: " + fromServer);
}
}
}
我不知道这样做是否是一个好的做法,我觉得不是"elegant",所以你能帮我一个更好的解决方案吗?
所以您的代码有以下不足之处:
- 您在每次读取时重新创建输入流。
- 你的 nested while 没用,fromServer 在第二次迭代时永远不会为 null。它只会挂起,直到数据被流式传输。 (这与从文件读取不同,明白吗?)
现在呢?去掉outerwhile循环,在内循环中将条件改为true(无限);它只会在异常时终止。
还有一点,把print语句移到while里面,不然不会只在异常后才调用
希望这能让您理清思路。