2011-10-08 38 views
2

我正在设计一款网络游戏,因此我有一个客户端,其中一个监听线程来自服务器,而服务器也有一个监听线程正在监听来自客户端的消息。有关多线程编程的赛车场景

在客户端面板我下面的一个:发送一些信息给服务器
后来自同一个地方的两行代码与其他功能再次这样做。
结果是有时运行良好并且有时会抛出异常的代码运行。 在客户端面板上的某个发送函数的行处抛出异常。

注:如果我把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

+1,用于堆栈跟踪 – doNotCheckMyBlog

回答

2

假设:这是因为你使用的是同一个插座对象为两种功能,而这两种功能想要写的东西插座输出流。我希望我是对的。基于这个我会去使用同步。下面的链接将引导你通过对对象进行锁定的方式,以便两个不同的线程不能访问同一个对象。当你完成隐式锁定而不是释放时,你会创建隐式锁定。 :)当然,你可以创建两个不同的线程来调用两个不同的函数。 (更安全......)

链接:Intrinsic Locks and Synchronization

希望这将帮助你解决。

+0

我尝试了一些东西,但仍然无法使用。我试着去思考为什么两个函数都想同时写入它不可能是因为它们会一个接一个地发送,所以在一次发送之后应该是第二次发送。我添加了更多相关的代码 – JavaSa

+0

对不起,我不能粘贴更多的代码,因为它没有缩进,就像netbeans“看到”它,它通过编译!有些编辑规则有时是非常幼稚的。 – JavaSa

+0

这对我来说很难诊断没有代码:)。我建议同步,因为你提到了你的Thread.sleep()测试。这清楚地表明代码正在使用套接字写入togeather。或者只是给我一个psuedo参考关于什么基本上你的代码,我可能会想办法解决:) – doNotCheckMyBlog