1

找到解决方案(考虑这个关闭并回答,因为我无法在 7 小时之前回答我自己的问题)。我留下了一个不必要的套接字实例,它使客户端应用程序挂起。很抱歉为此打扰大家,并感谢您为帮助我四处寻找问题所付出的努力=)爱你们!

我正在寻找解决这个“问题”的方法。我有一个银行模拟应用程序,需要模拟银行多个分支机构之间的银行转账。我目前使用一个事件总线来调度客户端连接器对象捕获的不同事件对象。如果客户端侦听接收到的事件,它将调用命令对象并更新它需要更新的任何内容,依此类推(只是为了让您了解全局)。

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

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);
    }

没有抛出异常,没有什么......第二个,第三个,......启动的实例永远不会超过这些非常简单的行。如您所知,上面的代码是在客户端主函数实例化的 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();
        }
    }
}

}

所以嗯……是的……我已经为此努力了好几个小时,我真的需要一些帮助,因为我对此感到抓狂。如果您需要更多代码,我会粘贴它。谢谢 =)

4

2 回答 2

1

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

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

于 2011-06-27T14:52:13.177 回答
0

哦,好吧……经过8个小时的艰苦调试,我发现问题出在我的小我身上。我在客户端应用程序调用的类的隐藏角落的某个地方留下了一个不必要的 Socket 实例漫游......这使它挂起。很抱歉打扰大家,我犹豫了 8 个小时才发布它,因为我知道这是一个复杂的应用程序,需要在不编写代码时进行调试……而且我发现了这个问题

于 2011-06-28T20:49:46.953 回答