所以我在java中创建了一个基本的客户端 - 服务器程序。它开头是这样的:
我使用this tutorial毫不费力地使用它。每当我尝试引入多个客户端时,问题就出现了。我认为它会工作,因为我使用多个线程,但是,第二个客户端只是挂起,直到第一个客户端退出然后它启动它工作(服务器确实接受来自第二个客户端的输入,但它不响应任何东西,直到第一个客户退出)。
以下是我正在使用的代码:
import java.net.*;
import java.io.*;
public class Server extends Thread {
private ServerSocket listener;
public Server(int port) throws IOException {
listener = new ServerSocket(port);
}
public void run() {
while(true) {
try {
Socket server = listener.accept();
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("What is your name?");
DataInputStream in = new DataInputStream(server.getInputStream());
String user_name = in.readUTF();
out.writeUTF("Hello "+user_name);
while(true) {
String client_message = in.readUTF();
out.writeUTF(client_message);
}
}
catch(IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int port = 6006;
try {
Thread t = new Server(port);
t.start();
} catch(IOException e) {
e.printStackTrace();
}
}
}
有人可以解释我做错了吗?
我已经看过使用Runnable而不是Extends Thread,但是我遇到了更多的问题,所以我想先尝试使用它。
答案 0 :(得分:4)
传入连接仅由行listener.accept();
处理。但是在你连接了一个客户端后,你就陷入了while循环。您需要创建一个新的Thread
(或Runnable
在ExecutorService
上执行,如果您期望高负载),并启动它,然后立即接受下一个连接
答案 1 :(得分:3)
简而言之,这就是出了问题。
这是你需要做的:
创建两个类 1:服务器 - 类似于你现在拥有的,但它不是做一个充当回声服务器的实际工作,它只是产生一个新的线程,它开始在一个新的端口上监听(你可以随机选择),并发送客户端这个新端口的地址。然后,客户端将获取新的端口号,并尝试连接到新端口上的服务器。 2:Echo线程 - 这会在传递的端口上启动一个新的侦听器,并且可以回应那些正在侦听的人。
OR:
启动UDP服务器而不是TCP服务器,所有这些都无关紧要,但这不属于这个特定问题的范围。