java - 输入套接字意外关闭时吞下 IOException

标签 java sockets codenameone socketexception

当套接字意外关闭时,此代码段失败。不 IOException 被抛出,并且 s.read() 永远不会返回。

  try {
   while (!doneReading)
   {    /* read blocks waiting for data */
    int readResult = s.read(inBuf, inBufLength, 1);
    ...
   }
  }
  catch (IOException err) { .. }

当socket初始关闭时,栈如下:

    Thread [Thread-10] (Suspended (exception SocketException))  
        SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]    
        SocketInputStream.read(byte[], int, int, int) line: 150 
        SocketInputStream.read(byte[], int, int) line: 121  
        SocketInputStream.read(byte[]) line: 107    
        JavaSEPort$SocketImpl.readFromStream() line: 7462   
        JavaSEPort.readFromSocketStream(Object) line: 7601  
        Socket$SocketInputStream.read(byte[], int, int) line: 179   
        NetConn.runRead() line: 1044    
        NetConn.run() line: 989 
        Thread.run() line: 744  
C:\java\jdk1.8.0\bin\javaw.exe (Dec 23, 2015, 4:47:53 PM)   

socketexception 显然被捕获,并作为 ioexception 重新抛出 此时:

    Thread [Thread-10] (Suspended (exception IOException))  
        owns: DualStackPlainSocketImpl  (id=93) 
        DualStackPlainSocketImpl(AbstractPlainSocketImpl).available() line: 465 [local variables unavailable]   
        SocketInputStream.available() line: 238 
        JavaSEPort$SocketImpl.getAvailableInput() line: 7428    
        JavaSEPort$SocketImpl.readFromStream() line: 7452   
        JavaSEPort.readFromSocketStream(Object) line: 7601  
        Socket$SocketInputStream.read(byte[], int, int) line: 179   
        NetConn.runRead() line: 1044    
        NetConn.run() line: 989 
        Thread.run() line: 744  

        NetConn.run() line: 989 
        Thread.run() line: 744  

很难详细说明发生了什么,因为 JavaSEPort 的源未绑定(bind) 在eclipse环境下

更多信息:我获取了更多资源,可以看到 JavaSEPort.readFromStream 捕获 IOException 并返回 null。再往上几层,在 Socket.read 中有一个 while (buffer==null) 永远不会被转义。这完全解释了这种行为 - 我看到一个无限循环的堆栈跟踪并且读取永远不会返回。

最佳答案

当出现错误时,您应该得到 connectionError 回调而不是异常。

关于java - 输入套接字意外关闭时吞下 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34446014/

相关文章:

python - 为什么我不能在 Python 中接收 UDP 数据包?

javascript - 创建 Node.js + socket.io 服务器/客户端,进行用户身份验证、发送/接收数据

css - 尝试在 Codename One 中的 MultiButton 上设置按下/选择的样式会导致堆栈溢出错误

java - 小部件的所有实例的 GWT setStylePrimaryName

java - 级联/嵌套异步调用的模式

ios - 没有 iOS 套接字框架可以连接到服务器套接字

android - Google oauth 使用 native 客户端在 Android 设备上登录代号 one 无法正常工作

mobile - 代号一是如何运作的?

java - Jenkins 不会在自由风格项目上使用环境变量过滤 Maven 资源

java - 如何解决 android Admob 中的无广告配置问题?