我尝试实现服务器-客户端应用程序并成功连接到服务器,但是当服务器关闭时,客户端不会从 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/