【发布时间】:2016-04-27 22:39:04
【问题描述】:
我一直在使用 TCP 服务器/客户端的东西。在连接多个客户端的多个用户时,我非常擅长 UDP 编程。我尝试在使用 Threads 制作的 TCP 服务器上做同样的事情,但是每当 Thread 访问这段代码时
String reader = (String)in.readObject();
产生了一个错误,线程停止执行代码,但线程仍然运行程序保持它活着。 无论如何,这里是整个源代码:
public class TestServer implements Runnable {
private Thread run, streams, connect, receive, send;
private ServerSocket socket;
private Socket conn;
private ObjectInputStream in;
private ObjectOutputStream out;
private boolean running, incomingMessage = false;
private int port;
public TestServer(int port) throws IOException {
this.port = port;
socket = new ServerSocket(port);
console("Server stated on : " + InetAddress.getLocalHost() + " : " + port);
run = new Thread(this, "Run");
run.start();
}
public void run() {
running = true;
connect();
receive();
}
private void connect() {
connect = new Thread("Connect") {
public void run() {
while(running) {
try {
conn = socket.accept();
} catch (IOException e) {
e.printStackTrace();
}
console("You are now connected" + conn.getInetAddress().toString() + " : " + conn.getPort());
try {
setupStreams();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}; connect.start();
}
private void setupStreams() throws IOException {
streams = new Thread("Streams") {
public void run() {
try {
console("Setting up Streams");
out = new ObjectOutputStream(conn.getOutputStream());
out.flush();
in = new ObjectInputStream(conn.getInputStream());
console("Streams are now setup");
incomingMessage = true;
receive.start();
} catch(IOException e) {
e.printStackTrace();
}
}
}; streams.start();
}
private void receive() {
receive = new Thread("Receive") {
public void run() {
while(incomingMessage) {
String message = "";
try {
message = (String) in.readObject();
//This is the only flaw the program
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
console("Client : " + message);
}
}
};
}
private void console(String message) {
System.out.println(message);
}
public static void main(String[] args) {
try {
new TestServer(1234);
} catch (IOException e) {
e.printStackTrace();
}
}
}
仅供参考,我对此并不陌生。该错误是因为即使没有要接收的数据包,服务器也开始接收数据包。但是因为线程强制它接收它,所以我在线程中生成错误并且不知道任何其他方法来解决这个问题。所以请帮忙。提前致谢。
【问题讨论】:
-
incomingMessage除了在初始化程序中之外,永远不会设置为false,因此 while 循环无法结束。 -
定义'产生错误'。