套接字异常:套接字在字节数组中读取时抛出

时间:2016-03-22 20:44:13

标签: java sockets stream socketexception instant-messaging

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

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

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

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的值,然后使用{{检查它是Stringbyte[]等。 1}}(如果那是相关的)。当即时通讯工具只是在客户端和服务器之间时,这种方法的相当类似的版本工作得更早。我知道我遗漏了很多代码;只是问,我会编辑或评论。

以下是实际服务器程序中分配新对象的代码(请记住instanceofreceivedslastReceiveds,这是在ArrayList中运行的环):

for(int i = 0)

然后我继续对lastReceiveds.set(i, receiveds.get(i)); receiveds.set(i, readerThreads.get(i).getReceived()); 的元素执行.equals并继续处理数据。

[编辑] 所以我被告知我正在关闭我的套接字,流等,这是真的。以下是导致此问题的代码(正在调用的receiveds方法,只关闭我的所有套接字,流等):

close()

对不起,这一切都是如此缩进。每当收到一个字节数组时,它就会输出 try{ waitForConnection(); setupStreams(); System.out.println("Got to here"); whileChatting(); }catch(EOFException eofException){ showMessage("\nERROR! CONNECTION REFUSED"); eofException.printStackTrace(); }finally{ close(); } close()`。

1 个答案:

答案 0 :(得分:0)

此异常意味着关闭了此代码中某处的套接字,然后继续使用它。它与同伴或其发送的内容无关。

你还需要单独捕捉EOFException,并在没有记录的情况下突破循环。除IOException之外的任何其他SocketTimeoutException对连接也是致命的,并且应该导致中断。