Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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/6/multithreading/4.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 通过DataOutputStream发送信息会引发异常_Java_Multithreading_Swing_Sockets_Timer - Fatal编程技术网

Java 通过DataOutputStream发送信息会引发异常

Java 通过DataOutputStream发送信息会引发异常,java,multithreading,swing,sockets,timer,Java,Multithreading,Swing,Sockets,Timer,假设您在网络游戏中有计时器的以下代码实现: public void DefineTimer() { Action updateClockAction = new AbstractAction() { public void actionPerformed(ActionEvent e){ //System.out.println(javax.swing.SwingUtilities.isEve

假设您在网络游戏中有计时器的以下代码实现:

public void DefineTimer()
    {
            Action updateClockAction = new AbstractAction() {
                public void actionPerformed(ActionEvent e){

                    //System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());

                     JPanelMainGame.this.jLabelSeconds.setFont(new java.awt.Font("Lucida Handwriting", 1, 36));
                     JPanelMainGame.this.jLabelSeconds.setForeground(Color.red);
                     JPanelMainGame.this.jLabelSeconds.setText(Integer.toString(JPanelMainGame.this.m_TimerTotalSeconds));

                    if( JPanelMainGame.this.m_TimerTotalSeconds >0)
                    {
                         JPanelMainGame.this.m_TimerTotalSeconds--;
                    }
                    else if ( JPanelMainGame.this.m_TimerTotalSeconds == 0)
                    {
                       // System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
                        JPanelMainGame.this.m_Timer.stop();
                        JPanelMainGame.this.jLabelSeconds.setText("0");
                        JPanelMainGame.this.jButtonFinish.setVisible(false);
                        System.out.println("after JbuttonFinish set visble false");
                        System.out.println("!m_WasGameDecisived: "+!m_WasGameDecisived);
                       // System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
                        JPanelGameApplet gameApplet = (JPanelGameApplet) getTopLevelAncestor();
                        //Checking whether time ended for both players and no solution was recieved

                        if(gameApplet.GetJPanelChooseGame().GetGameType() == eGameType.Net)
                        {

                            gameApplet.GetClinetThread().UpdateServerOfTimeEnded();
                            System.out.println("After Update");
                            if (!m_WasGameDecisived)
                            {
                                // System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
                                System.out.println("Tie - No one had a solution in the given time");


                                gameApplet.GetClinetThread().SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer();
                                System.out.println("After SendRequestToClosePlayerThread");
                                gameApplet.GetClinetThread().CloseSocket();
                                System.out.println("After CloseSocket");
                                Menu.BrowseTo(PanelMenuNumber.k_ChooseGame, JPanelMainGame.this.getParent());
                                //askUserForAnotherRoundLeaveTableOrExitProgram();//////////////////////////////////////////////To implement
                            }
                        }
                        else if(gameApplet.GetJPanelChooseGame().GetGameType() == eGameType.Single)
                        {
                            JPanelMainGame.this.showPopUpSelectionBar();

                        }
                    }
                }
            };
            m_Timer = new Timer(1000, updateClockAction);
    }  
我添加了以下函数(它们写入相同的DataOutputStream:

gameApplet.GetClinetThread().UpdateServerOfTimeEnded();

gameApplet.GetClinetThread().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:851)
        at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:313)
        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:825)
        at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:327)
        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)

根据对您问题的评论,“来自Swing计时器内”表示存在设计缺陷,但异常本身只是一个网络错误,与Swing完全无关。有一篇Microsoft知识库文章,您应该阅读,但简而言之,此异常和此错误文本表示本地TCP堆栈已损坏由于之前的网络发送问题,已放弃写入该连接。

在EDT上进行网络调用不是一个好主意。您最好将网络调用重构为
Runnable
和call
SwingUtilities.invokeLater(Runnable)
在您的
actionPerformed
method.mmm中,您能给出一个示例代码吗,我想我不能在EDT中根据第一条注释
public void actionPerformed(ActionEvent e){SwingUtilities.invokeLater(new Runnable(){public void run(){/*您当前的网络代码*/}});}
对不起,它叫SwingWorker(没有空格),不,这不是做后台线程的唯一方法,因为任何普通的后台线程都可以工作,但它有一些优势,包括上面提到的发布/处理,而且它是一个未来,因此它可以返回一些东西。它还具有很好的PropertyChange支持。你可以在这里找到更多关于它的信息:好的,谢谢,我将尝试缩短故事并更全面地解释我的设计。我正在实现一个网络游戏,其中我有一个小程序客户端和服务器。两个玩家正在玩,赢家是在较早时间(倒计时)有解决方案的玩家我认为将计时器放在客户端小程序上是明智的,这样他就会看到计时器。我不认为将计时器放在服务器上是明智的,因为它应该等于客户端看到的,并在同一时间启动。所有的问题都是因为绑定场景-我在计时器秒数为0时看到它,所以,当它发生时,我需要首先要更新时间用完的服务器-否则可能会带来一些我不想要的其他场景,我想关闭服务器上的客户端线程(在连接时间内为每个客户端打开)在我关闭客户端之前itself@JavaSa,正如我在你的另一篇文章中所说,似乎你需要等待,直到你使用那个套接字对象。无论如何……有效地……@JavaSa这一切都是不相关的。请看我的答案。你现在评论的那个。你的程序结构肯定有错,但这不是这个异常的原因。@JavaSa这正是我上面所说的。问题是阻止网络操作也会阻止你的用户界面。