首先,我不太确定如何解释,没有听起来令人困惑,所以我会尽量简化。我有一个服务器应用程序,可以将两个客户端“配对”,作为双人游戏的一部分。发生的方式是,当第一个客户端连接到服务器时,套接字连接被接受,则使用该客户端创建一个新的ClientProtocol线程但未启动。当另一个客户端连接到服务器时,他被添加到前一个线程中,然后启动该线程。该线程知道两个输入流和两个输出流,每个客户端一个。但是,当我尝试从客户端或服务器端读取时,没有任何反应。这适用于单个线程中的单个客户端。下面是一些代码:Java客户端服务器/一个线程多个客户端
服务器端(主线程)
public static Queue<ContestProtocol> contesters;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
contesters = new LinkedList<ContestProtocol>();
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(-1);
}
while (true) {
Socket socket = serverSocket.accept();
ObjectInputStream ois;
ObjectOutputStream oos;
try {
ois = new ObjectInputStream(socket.getInputStream());
oos = new ObjectOutputStream(socket.getOutputStream());
synchronized (contesters) {
if (contesters.size() == 0) {
Contester contester1 = new contester(ois, oos);
contesters.add(new ContestProtocol(contester1));
} else {
Contester contester2 = new Contester(ois, oos);
contesters.poll().hook(contester2).start();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
服务器端(ContestProtocol)
private Contester contester1, contester2;
public ContestProtocol(Contester contester1) {
super("ContestProtocol");
}
public ContestProtocol hook(Contester contester2) {
this.contester2 = contester2;
return this;
}
public void run() {
try {
contester1.getOOS().writeInt(-1);
contester2.getOOS().writeInt(-2);
} catch (Exception e) {
e.printStackTrace();
}
}
服务器端(contester):
public Contester(ObjectInputStream ois, ObjectOutputStream oos) {
this.ois = ois;
this.oos = oos;
}
public ObjectInputStream getOIS() {
return ois;
}
public ObjectOutputStream getOOS() {
return oos;
}
客户端:
try {
socket = new Socket(serverAddr, 4444);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
int selectedChampion = ois.readInt();
} catch (Exception e) {
e.printStackTrace();
}
ContestProtocol线程完成执行没有问题,但两个客户端挂在readInt()。我不懂为什么。
我不确定如果我喜欢你接近这个方式,但是,但是,这两个客户端应该得到这些整数。 Wireshark说什么?数据是否从服务器中传出? – 2012-04-25 15:51:52
经过一些测试后,似乎有些线程必须互相阻塞。调用ois.available()将挂起在调试器中。 – Renaud 2012-04-25 16:07:59
噢,我预见了你的设计不起作用,但无聊,客户应该在服务器锁定一些阅读电话之前得到他们的意见。 – 2012-04-25 18:01:18