【问题标题】:Java Socket Connections in Queue队列中的 Java 套接字连接
【发布时间】:2010-12-15 03:36:39
【问题描述】:

我设置了客户端/服务器。服务器 (Provider.java) 将接受 2 个 Socket 连接。每个客户端在连接后都会被询问他们想玩什么类型的游戏 - 井字游戏、国际象棋或 Connect 5。根据他们的回答,Socket 连接将存储在特定的游戏队列中。所以,井字游戏有一个队列,连接 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();
}

上面抛出了某种流损坏错误。以下是我的问题:

首先,当客户端首次连接时,套接字连接与ObjectInputStreamObjectOutputStream 相关联。这些流不会与连接一起传递到队列中,因此在上面的代码中,新流被分配给连接。然后,这些流被传递到线程游戏中以开始游戏。我可以这样做(为连接分配新流)吗?在已将流分配给它们之后?

其次,我是否正确地存储/删除队列中的套接字连接?

感谢您的帮助!

更新:


这是我得到的错误:

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)

事实证明,我无法将一组额外的输入/输出流分配给已经分配了一组流的套接字连接。

感谢大家的帮助!

【问题讨论】:

  • 我们可以看到一些流损坏错误堆栈跟踪,还是商业机密?

标签: java sockets stream


【解决方案1】:

老实说,这个问题看起来像是大学作业的解决方案。

提示:先写简单的发布者/订阅者。设置一个将向套接字写入 hello world 的进程和将从该套接字读取的第二个进程。然后从那里拿走。我敢打赌你错过了一些明显的东西:-)

【讨论】:

    【解决方案2】:

    我的猜测是该异常与您在帖子开头描述的代码有关。在你的程序到达你发布的代码的 sn-p 之前,我会先调查你对套接字做了什么。

    【讨论】:

      【解决方案3】:

      您确定在构造对象 IO 流之前从套接字中检索了所有打开的握手吗?

      例如,如果客户端发送TTT\n\n 作为游戏请求,而您的代码只读取TTT\n 而将另一个\n 留在流中,则 ObjectInputStream 将失败。

      您没有显示从套接字读取用户游戏选择的部分。所以,这只是一个猜测。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 2016-06-09
        • 2013-02-02
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        相关资源
        最近更新 更多