Java ObjectInputStream挂起在第二个客户端实例上

时间:2011-06-27 14:46:55

标签: java sockets hang objectinputstream

找到解决方案(考虑到这个已关闭并回答,因为我在7小时之前无法回答我自己的问题)。我留下了一个不必要的Socket instanciation,它使clien应用程序挂起。很抱歉打扰了你们所有人,感谢你们帮助我四处寻找这个问题所做的努力=)爱你们所有人!

我很难找到解决这个“问题”的方法。我有一个银行模拟应用程序,需要模拟银行多个分支之间的银行转账。我目前使用一个事件总线来调度客户端连接器对象捕获的不同事件对象。如果客户端监听收到的事件,它将调用一个命令对象并更新它需要更新的内容等等(这样你就能得到一个大图)。

现在,由于某些原因我无法理解,我的第一个客户端实例打开正常,并且行为与预期一样,但是在第一个客户端实例之后打开的任何客户端实例将在这些行中挂起(变量在初始化之前声明): / p>

try {
        s = new Socket(ip, port);
        System.out.println("Creating out stream");

        oos = new ObjectOutputStream(s.getOutputStream());
        oos.flush();
        System.out.println("Flushed data...");

        ois = new ObjectInputStream(s.getInputStream());

        //Below never gets printed on second client instance *sigh*
        System.out.println("HURRAY");
        readStream = new ReadEventFromStream(ois, this);
    } catch(IOException ioe) {
        ioe.printStackTrace();
        System.out.println("Can't connect to server.");
        System.exit(1);
    }

没有抛出任何异常,没有任何东西......第二个,第三个,...实例启动将永远不会超过这些非常简单的线条。您知道,上面的代码是在客户端main函数实例化的EventBusConnector(...)对象中调用的。下面是使用命令对象的ReadEventFromStream类:

class ReadEventFromStream extends Thread {
private ObjectInputStream ois;
private EventBusConnector eventBusConn;
public ReadEventFromStream(ObjectInputStream ois, EventBusConnector eventBusConn) {
    this.ois = ois;
    this.eventBusConn = eventBusConn;
}

@Override
public void run() {
    while(true) {
        try {
            Object o = ois.readObject();
            if (eventBusConn.listensToEvent(o)) {
                Command command;
                if( o instanceof EventBranchListUpdate ) {
                    EventBranchListUpdate event = (EventBranchListUpdate) o;
                    command = new UpdateBranchListCommand(event, EventBusConnector.branch);
                    command.execute();
                } else if ( o instanceof EventNewBranch ) {
                    EventNewBranch event = (EventNewBranch) o;
                    command = new NewBranchCommand(event, this.eventBusConn);
                    command.execute();
                } else if( o instanceof EventMoneyTransfer ) {
                    EventMoneyTransfer event = (EventMoneyTransfer) o;
                    command = new MoneyTransferCommand(event, EventBusConnector.branch);
                    command.execute();
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

}

如此嗡嗡......是的......我一直在粉碎我的头几个小时,我真的需要一些帮助,因为我对此感到疯狂。如果您需要更多代码,我会粘贴它。谢谢=)

2 个答案:

答案 0 :(得分:1)

您在哪里为每个连接创建一个线程?

除非您为每个连接创建一个线程,否则在最后一个连接完成之前,新连接将不会执行任何操作。

答案 1 :(得分:0)

哦好吧......经过8个小时的艰苦调试,我发现问题是我的小自我。我在客户端应用程序调用的类的隐藏角落中留下了一个不必要的Socket实例漫游...这使它挂起。很抱歉打扰你这一切,我犹豫了8个小时发布它,因为我知道这是一个复杂的应用程序调试时,如果没有编写代码...我发现那个