java.net.SocketException:软件导致连接中止:套接字写入错误[重复]

Posted

技术标签:

【中文标题】java.net.SocketException:软件导致连接中止:套接字写入错误[重复]【英文标题】:java.net.SocketException: Software caused connection abort: socket write error [duplicate] 【发布时间】:2011-02-21 03:17:06 【问题描述】:

我正在尝试将图像从 Java 桌面应用程序发送到 J2ME 应用程序。问题是我得到了这个异常:

java.net.SocketException: Software caused connection abort: socket write error

我在网上看了一圈,虽然这个问题并不罕见,但我找不到具体的解决方案。我在传输之前将图像转换为字节数组。这些是分别在桌面应用程序和 J2ME 上找到的方法

    public void send(String ID, byte[] serverMessage) throws Exception
                
        //Get the IP and Port of the person to which the message is to be sent.
        String[] connectionDetails = this.userDetails.get(ID).split(",");
        Socket sock = new Socket(InetAddress.getByName(connectionDetails[0]), Integer.parseInt(connectionDetails[1]));
        OutputStream os = sock.getOutputStream();
        for (int i = 0; i < serverMessage.length; i++)
        
            os.write((int) serverMessage[i]);
        
        os.flush();
        os.close();
        sock.close();
    

    private void read(final StreamConnection slaveSock)
    
        Runnable runnable = new Runnable()
        
            public void run()
            
                try
                
                    DataInputStream dataInputStream = slaveSock.openDataInputStream();
                    int inputChar;
                    StringBuffer results = new StringBuffer();
                    while ( (inputChar = dataInputStream.read()) != -1)
                    
                        results.append((char) inputChar);
                    
                    dataInputStream.close();
                    slaveSock.close();
                    parseMessage(results.toString());
                    results = null;
                

                catch(Exception e)
                
                    e.printStackTrace();
                    Alert alertMsg = new Alert("Error", "An error has occured while reading a message from the server:\n" + e.getMessage(), null, AlertType.ERROR);
                    alertMsg.setTimeout(Alert.FOREVER);
                    myDisplay.setCurrent(alertMsg, resultScreen);
                
            
        ;
        new Thread(runnable).start();
       

我正在通过 LAN 发送消息,当我发送短文本消息而不是图像时我没有问题。另外,我使用了wireshark,似乎桌面应用程序只发送了部分消息。任何帮助将不胜感激。此外,一切都在 J2ME 模拟器上运行。

【问题讨论】:

【参考方案1】:

请参考Official reasons for "Software caused connection abort: socket write error"的答案

编辑

我认为一般情况下没有什么可以说的,而且您的代码似乎没有任何异常会导致连接中止。但我会注意到:

无需将write 调用的字节转换为整数。它将自动升级。 使用write(byte[]) 而不是write(int) 会更好(更简单,在网络流量方面可能更有效)。 接收方假设每个字节代表一个完整的字符。这可能是不正确的,具体取决于发送方如何形成要传输的字节,并且 最好先发送一个字节计数,这样接收端就可以在发送方发送整个字节数组之前判断是否出现问题。

【讨论】:

我已经看过这些答案了。我查看了 Windows 事件日志,我没有看到任何相关的事件,尽管我在浏览这些日志方面没有那么有经验。其次,我还尝试添加了 shutdownOutput();但仍然无济于事。最后,我收到来自 J2ME 应用程序的错误,提示套接字已关闭。 嗯...我不知道怎么做,但我现在似乎可以让它工作了。我尝试将转换替换为整数部分,但这完全破坏了我的应用程序,完全禁用了它。我今天尝试发送它并且它有效。我的猜测是这是一些外部原因,可能是路由器重新启动或其他原因。

以上是关于java.net.SocketException:软件导致连接中止:套接字写入错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致我的 java.net.SocketException:连接重置? [复制]

如何修复 java.net.SocketException:损坏的管道?

Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置

java.net.SocketException:recvfrom 失败:ETIMEDOUT(连接超时)

java.net.SocketException:软件导致连接中止:recv 失败 [重复]

如何解决 java.net.SocketException:使用 selenium 的 java 中的连接重置异常?