我设置了客户端/服务器。服务器(Provider.java
)将接受2个Socket连接。每个客户端在连接后,会被问到他们想要玩什么类型的游戏 - Tic Tac Toe,Chess或Connect 5.根据他们的答案,Socket连接然后存储在特定的游戏队列中。因此,Tic Tac Toe有一个队列,而Connect 5有一个队列等等。
队列实现如下:
Queue<Socket> qTTT = new LinkedList<Socket>();
Queue<Socket> qC5 = new LinkedList<Socket>();
Queue<Socket> qChess = new LinkedList<Socket>();
每次添加连接时,都会检查队列以查看是否有两个连接。如果特定队列中有两个连接,则将启动具有两个连接的该类型的游戏。 (采用工厂设计模式设计)。
if (qTTT.size() == 2) {
ObjectOutputStream out = null, out2 = null; // Client 1, Client 2
ObjectInputStream in = null, in2 = null; // Client 1, Client 2
Socket connection1 = null, connection2 = null;
connection1 = qTTT.remove();
connection2 = qTTT.remove();
try {
out = new ObjectOutputStream(connection1.getOutputStream());
out2 = new ObjectOutputStream(connection2.getOutputStream());
in = new ObjectInputStream(connection1.getInputStream());
in2 = new ObjectInputStream(connection2.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
SimpleGameFactory factory = new SimpleGameFactory();
GameStore store = new GameStore(factory);
Game game = store.orderGame("TTT");
System.out.println("We ordered a " + game.getName() + "\n");
tgame.setObject(game);
tgame.setSockets(connection1, connection2);
tgame.setStreams(in, out, in2, out2);
// Start the threaded game
tgame.start();
}
以上是抛出某种Stream损坏错误。以下是我的问题:
首先,当客户端首次连接时,套接字连接与ObjectInputStream
和ObjectOutputStream
相关联。这些流不会通过连接传递到队列中,因此在上面的代码中,新的流被分配给连接。然后,将这些流传递到线程游戏中以开始游戏。我可以这样做(为连接分配新的流)吗?流已经分配给他们了吗?
其次,我是否正确地存储/删除队列中的套接字连接?
感谢您的帮助!
更新:
以下是我遇到的错误:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2232)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2698)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:750)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at Pools.check_pools(Pools.java:34)
at Provider.start(Provider.java:85)
at StartServer.main(StartServer.java:16)
事实证明,我无法为已经分配了一组流的套接字连接分配一组额外的输入/输出流。
感谢大家的帮助!
答案 0 :(得分:4)
老实说,这个问题看起来像是大学任务的解决方案。
提示:首先编写简单的发布者/订阅者。设置一个将hello world写入套接字的进程,以及将从该套接字读出的第二个进程。然后从那里拿走它。我打赌你错过了一些明显的东西: - )
答案 1 :(得分:2)
在构建Object IO流之前,您确定是否已从套接字中检索到所有打开的握手吗?
例如,如果客户端发送TTT\n\n
作为游戏请求,并且您的代码只读取TTT\n
并将另一个\n
留在流上,则ObjectInputStream将失败。 / p>
您不会显示从套接字读取用户游戏选择的部分。所以,这只是猜测。
答案 2 :(得分:1)
我的猜测是,该异常与您在帖子开头描述的代码有关。在您的程序获得您发布的代码片段之前,我首先要查看您使用套接字执行的操作。