Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ObjectInputStream挂起在第二个客户端实例上_Java_Sockets_Freeze_Objectinputstream - Fatal编程技术网

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

Java ObjectInputStream挂起在第二个客户端实例上,java,sockets,freeze,objectinputstream,Java,Sockets,Freeze,Objectinputstream,找到解决方案(考虑关闭并回答此问题,因为我无法在7小时前回答自己的问题)。我留下了一个不必要的套接字实例,它使客户端应用程序挂起。很抱歉为此打扰了你们所有人,感谢你们为帮助我四处寻找问题所付出的努力=)爱你们所有人 我正在寻找解决这个“问题”的办法,真是疯了。我有一个银行模拟应用程序,需要模拟银行多个分行之间的银行转账。我目前使用一个事件总线来调度客户端连接器对象捕获的不同事件对象。如果客户机侦听接收到的事件,它将调用一个命令对象,并更新它需要更新的任何内容,依此类推(只是为了让您了解全局) 现

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

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

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

没有异常抛出,没有任何东西…第二,第三。。。启动的实例将永远无法通过这些非常简单的行。正如您所知,上面的代码是在客户端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();
        }
    }
}
}


所以,嗯……是的……我已经在这个问题上砸了好几个小时了,我真的需要一些帮助,因为我对这个问题很感兴趣。如果你需要更多的代码,我会粘贴它。谢谢=)

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


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

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


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

哦……经过8个小时的艰苦调试,我发现问题出在我自己身上。我在客户端应用程序调用的类的隐藏角落中留下了一个不必要的套接字实例,这使它挂起。很抱歉打扰大家,我犹豫了8个小时才发布,因为我知道这是一个复杂的应用程序,需要在没有编写代码的情况下进行调试……我发现thg

哦……经过8个小时的艰苦调试,我发现问题出在我自己身上。我在客户端应用程序调用的类的隐藏角落中留下了一个不必要的套接字实例,这使它挂起。很抱歉打扰大家,我犹豫了8个小时才发布,因为我知道这是一个复杂的应用程序,在没有编写代码的情况下需要调试…我发现thg

尝试先读后写,它仍然挂起;第一个客户端应用程序像以前一样运行良好,第二个客户端应用程序将永远不会从
ObjectInputStream
的构造函数中返回。请尝试先读后写,它仍然挂起;第一个客户端应用程序像以前一样运行良好,第二个客户端应用程序将永远不会从
ObjectInputStream
的构造函数中返回。EventBusConnector类扩展线程本身。它的运行方法如下:
while(true){try{Thread.sleep(500);synchronized(lstEventsToSend){if(lstEventsToSend.size()>0){IEvent ie=lstEventsToSend.get(0);System.out.println(“Envoie de l'vénement”+ie.toString());oos.reset();oos.writeObject(ie);lstEventsToSend.remove(0);}}}catch(异常e){e.printStackTrace();}
Yikes抱歉,我将使用pastebin,我认为它会更好。您将在这里找到客户端的主方法和它调用的线程,以调用一个事件,声明一个新分支已登录系统:EventBusConnector类扩展了线程本身。它的运行方法如下:
while(true){try{Thread.sleep(500);synchronized(lstEventsToSend){if(lstEventsToSend.size()>0){IEvent ie=lstEventsToSend.get(0);System.out.println(“Envoie de l'vénement”+ie.toString());oos.reset();oos.writeObject(ie);lstEventsToSend.remove(0);}}}}catch(异常e){e.printStackTrace();}}}
Yikes抱歉,我将使用pastebin,我认为这样会更好。您可以在这里找到客户端的主方法和它调用的线程,以调用一个事件,声明新分支已登录到系统:
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();
        }
    }
}