我正在开发一款基于事件的游戏,主游戏逻辑托管在服务器上;目前它是一个非常小的功能集,只允许在两个参与者之间主持一个游戏。我已经阅读了关于ServerSocket
的各种问题,但没有一个问题能解答我的问题。我已经看了
在我的项目中,我使用ObjectInputStream
和ObjectOutputStream
。一切都按预期工作(在服务器端和客户端都接收/发送),但在两个套接字都注册后,accept
实例的ServerSocket
方法将继续永久阻塞,即使调用相同的代码也是如此之前。也许这是在通过套接字进行一次通信后出现的问题?
我的服务器日志显示以下内容:
等待接受 接受第一个插座
向socket1发送事件以通知等待对手
等待接受
接受第二个插座
向两个插座发送响应
等待接受(永远阻止)
当日志显示已发送的响应事件时,它们已在客户端正确接收和处理。客户端调试输出显示下一个事件肯定是发送。也许是关于不关闭客户端套接字(在第三个链接问题中提到)?无论如何,我无法关闭客户端套接字,因为无法进行进一步的通信。
客户端代码
public void send(Event e) {
try {
ObjectOutputStream out = new ObjectOutputStream(
socket.getOutputStream());
out.writeObject(e);
out.flush();
log.debug("sending event... "+e);
}
catch(IOException ioe) {
log.fatal("constructing oos failed", ioe);
}
}
服务器端代码
@Override
public void run() {
running = true;
while(running) {
try {
Socket s = socket.accept();
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Event event = (Event) ois.readObject();
try {
Event[] response = controller.consume(event);
ObjectOutputStream oos = new ObjectOutputStream(sockets[0].getOutputStream());
oos.writeObject(response[0]);
oos.flush();
ObjectOutputStream oos2 = new ObjectOutputStream(sockets[1].getOutputStream());
oos2.writeObject(response[1]);
oos2.flush();
}
catch(...) {
// multiple catch clauses for different exceptions
// all just logging (nothing passes silently!)
}
}
}
为了缩短,省略了将两个套接字分配给Socket[]
数组的方法,但由于无异常,因此保持套接字正常工作。你知道什么可能导致描述的行为吗?提前谢谢。
答案 0 :(得分:1)
accept
方法仅接受新连接。由于您只有两个客户端尝试连接到您的服务器,因此它将在您第三次调用accept
时无限期挂起。
旁注:您无需不断创建新的ObjectInputStream
和ObjectOutputStream
。您可以为每个Socket
创建一个,并保留对它们的引用以供重用。