【问题标题】:Socket Exception: socket closed Thrown When Reading in a Byte Array套接字异常:读取字节数组时抛出套接字关闭
【发布时间】:2016-03-22 20:44:12
【问题描述】:

首先,我还很新,所以我不确定要放什么代码,因为我认为问题可能出在很多不同的地方。无论如何,我正在制作即时通讯程序并发送图像。首先,我将图像转换为字节数组,然后将它们发送到服务器,然后将它们路由到客户端。在服务器端,我有一些线程监听任何类型的对象。这是他们的run() 方法:

@Override 
public void run(){      
    while(isAlive()){  
        try{
            received = input.readObject();
        }catch(IOException | ClassNotFoundException exception){
            exception.printStackTrace();
        }            
    }          
}

inputObjectInputStream,我有一个getter 来获取received 对象。但是,只有当我发送这个字节数组时,我才会在received = input.readObject() 行上得到一个SocketException。这是堆栈跟踪:

java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2296)
    at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2589)
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2599)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    at server.ReaderThread.run(ReaderThread.java:24)

那么你知道发生了什么吗?作为参考,在我的服务器类中,我通过 getter 将另一个对象分配给 received 的值,然后使用 instanceof 检查它是否是 Stringbyte[] 等(如果在所有相关的)。当即时通讯器只是在客户端和服务器之间时,这种方法的相当相似的版本工作得更早。我知道我遗漏了很多代码;只要问,我会编辑或评论。

这是分配新对象的实际服务器程序中的代码(记住receivedslastReceivedsArrayLists,这是在for(int i = 0) 循环中运行的):

lastReceiveds.set(i, receiveds.get(i));
receiveds.set(i, readerThreads.get(i).getReceived());

然后我继续对receiveds 的那个元素执行.equals 并继续处理数据。

[编辑] 所以有人告诉我我正在关闭我的套接字、流等,这是真的。这是导致这种情况的代码(正在调用的close() 方法只是关闭了我所有的套接字、流等):

            try{

                waitForConnection();
                setupStreams();
                System.out.println("Got to here");
                whileChatting();

            }catch(EOFException eofException){

                showMessage("\nERROR! CONNECTION REFUSED");
                eofException.printStackTrace();

            }finally{

                close();

            }

对不起,这一切都缩进了。每当它接收到一个字节数组时,它就会输出"Got to here", then runsclose()`。

【问题讨论】:

  • 你能发布更多代码吗?
  • EOFException not 表示“连接被拒绝”。这意味着对等方关闭了连接,这也意味着有一个连接,这也意味着它没有被拒绝。 `ConnectException:连接被拒绝'意味着'连接被拒绝'。不要编造自己的错误信息。使用异常中的那个,或者异常本身。
  • 谢谢。我将其更改为仅打印堆栈跟踪并说ERROR! END OF FILE
  • 好吧,可能是因为我处理字节数组的方式导致了IOException
  • 这也不是错误。对等方预计会在一段时间内断开连接。

标签: java sockets stream socketexception instant-messaging


【解决方案1】:

这个异常意味着在这段代码的某个地方关闭了套接字,然后继续使用它。它与对等方或它发送的内容无关。

您还需要单独捕获EOFException,并在获得时不记录就跳出循环。除了SocketTimeoutException 之外的任何其他IOException 对连接也是致命的,应该会导致中断。

【讨论】:

  • 所以我有一个 close() 方法可以关闭所有流,但我知道它没有被调用,所以这可能是由其他问题引起的,例如 NullPointerExceptionArrayOutOfBoundsException?
  • @dsiegler19 不,它是由在套接字或其任何流上调用 close() 引起的。 try-with-resources 语句也这样做。
  • 其实最后一条评论是骗人的。让我再看看它然后编辑。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 2014-03-01
  • 2013-10-10
  • 2013-05-16
  • 1970-01-01
  • 2018-05-20
  • 2011-03-09
  • 2017-07-18
相关资源
最近更新 更多