【发布时间】:2012-04-25 14:35:41
【问题描述】:
首先,我不太确定如何解释,以免听起来令人困惑,所以我会尽量简化。作为两人游戏的一部分,我有一个服务器应用程序将两个客户端“配对”在一起。发生的方式是,当第一个客户端连接到服务器时,接受套接字连接,使用该客户端创建一个新的 ClientProtocol 线程但未启动。当另一个客户端连接到服务器时,他被添加到前一个线程中,然后启动该线程。线程知道两个输入流和两个输出流,每个客户端一个。但是,当我尝试从客户端或服务器端读取时,什么都没有发生。这适用于单个线程中的单个客户端。这是一些代码:
服务器端(主线程)
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();
}
}
服务器端(竞赛协议)
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();
}
}
服务器端(参赛者):
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 说什么?数据是否从服务器出去?
-
经过一些测试,似乎某些线程必须相互阻塞。对 ois.available() 的调用将在调试器中挂起。
-
哦,我预计您的设计无法正常工作,但尽管如此,客户端应该在服务器锁定某些读取调用之前获得它们的整数。
标签: java multithreading client