我正在设计一个网络游戏,所以我有一个客户端,一个监听线程来自服务器的东西,服务器也有一个监听线程,它正在收听来自客户端的消息。
在其中一个客户面板中,我执行以下操作:
向服务器发送一些消息,并在来自同一地方的两行代码再次使用其他功能执行此操作
结果是一系列代码有时运行良好,有时会抛出异常。
在客户端面板上的一个发送功能的行上抛出异常。
注意:如果我在两个发送之间放置Thread.sleep(1000);
,则不会抛出任何异常,但正如您所知,这是一个糟糕的解决方案..
* 将信息发送到唯一的服务器线程的两个函数是:
ClientCommunicationThread.UpdateServerOfTimeEnded
ClientCommunicationThread.SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer
我该如何解决这个问题 感谢。
这是堆栈跟踪:
java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at java.io.DataOutputStream.writeInt(DataOutputStream.java:181) at GUI.ClientCommunicationThread.UpdateServerOfTimeEnded(ClientCommunicationThread.java:850) at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:312) at javax.swing.Timer.fireActionPerformed(Timer.java:271) at javax.swing.Timer$DoPostEvent.run(Timer.java:201) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at java.io.DataOutputStream.writeInt(DataOutputStream.java:180) at GUI.ClientCommunicationThread.SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer(ClientCommunicationThread.java:824) at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:325) at javax.swing.Timer.fireActionPerformed(Timer.java:271) at javax.swing.Timer$DoPostEvent.run(Timer.java:201) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
答案 0 :(得分:2)
假设:发生这种情况是因为您正在为两个函数使用相同的套接字对象,并且这两个函数都希望将某些内容写入套接字输出流。我希望我是对的。基于此我的go将使用同步。下面的链接将指导您通过一些锁定对象的方式,以便两个不同的线程无法一起访问同一个对象。完成后,您可以创建隐式锁定而不是释放。 :)当然,您可以创建两个不同的线程来调用两个不同的函数。 (更安全......)
链接:Intrinsic Locks and Synchronization
希望这会帮助你解决。