Java SocketChannel 没有在 linux 环境下抛出 IOException

标签 java linux

我尝试实现服务器-客户端应用程序并成功连接到服务器,但是当服务器关闭时,客户端不会从 channel.finishConnect 抛出 IOException(java.io.IOException:现有连接被远程主机强行关闭) () 或 channel.read() 方法在我期望的 linux 环境中。

我在windows环境下测试代码,运行良好。

 protected void mainLoop() {
    int count;
    String message = "";
    long connStartTs = 0, connEndTs = 0;
    while (true) {
        try {

            if (activeCommand == ConnectionCommand.DISCONNECT_AND_LOGOUT) {

                disconnect();
            } else if (activeCommand == ConnectionCommand.CONNECT_AND_LOGIN) {
                openChannel();
                if (connecting && (connEndTs - connStartTs) > cGlobals.CLIENT_SOCKET_TIMEOUT) {
                    throw new Exception("Connection timed out");
                }
                if (channel.isConnectionPending() && !channel.finishConnect()) {
                    continue;
                }
                if (!channel.isConnected()) {
                    ..
                } else if (!logonSent && channel.isConnected()) {
                    ..
                } else if (logonSent && channel.isConnected()) {
                    ByteBuffer buffer = ByteBuffer.allocate(20000);
                    count = 0;
                    while ((count = channel.read(buffer)) > 0) {
                        buffer.flip();
                        processSocketData(Charset.defaultCharset().decode(buffer));
                    }
                   ..
                }
            }
            Thread.sleep(10);
        } catch (Exception exc) {
            Log4Me.getLogger().info(Log4Me.exceptionMessage(exc));
            try {
                channel.close();
            } catch (IOException ex) {
                Log4Me.getLogger().error(Log4Me.exceptionMessage(exc));
            }
        }
    }
}

你有什么想法吗?

最佳答案

大多数情况下,IOExceptions 的文本来自操作系统。您不应依赖它作为跨平台功能。

关于Java SocketChannel 没有在 linux 环境下抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32230600/

相关文章:

java - 为什么一个对象在线程中初始化并从 main 访问时有时为 null?

java - 如何在数据库中搜索特定单词(值)?

android - 为android平台编译NITE2

linux - set -e 和 set -o errexit 有区别吗?

android - 下载 android-ndk-r9-linux-x86

linux - 将文件读入变量,然后用转义字符替换控制字符

java - @TransitionFrom 和@TransitionTo 应该如何使用

java - 如何将数据库行 ID 分配给按钮

java - 找不到 :vfw:Microsoft WDM Image Capture (Win32):0 的播放器

php - 随机 PHP FastCGI/连接由对等/不完整的 header 重置