netty 做socket服务端,客户端是其他方式实现的(客户端flush之后调用了shutdownOutput)。能收到请求,不能给客户端响应。

野渡无人舟自横 发布于 2018/01/05 15:22
阅读 933
收藏 0

客户端是java.net.Socket 实现。

Socket socket = new Socket(ip, port);
            socket.setSoTimeout(30000);
            DataOutputStream out = new DataOutputStream(socket
                    .getOutputStream());
            out.write(send.getBytes("GBK"));
            out.flush();
            socket.shutdownOutput();

去掉shutdownOutput(),请求应答都正常。加上之后,netty服务端写响应信息时,channnel状态isWritable,isActive 全部为false,不能正常写入响应。是什么原因呢?

加载中
0
繁华成落叶
繁华成落叶

客户端请求关闭通道,服务端就把通道已经关闭了?

野渡无人舟自横
野渡无人舟自横
是啊,按理说关闭的只是写通道
0
繁华成落叶
繁华成落叶
通道只有一个,状态分为几个。
0
hibegin
hibegin
为什么要shutdownOutput,其实你点进去看下源码就晓得了,多半output 或者 input 关闭都会导致关闭对应的 socket 的。
0
野渡无人舟自横
野渡无人舟自横
问题已解决,netty服务端设置ChannelOption参数ALLOW_HALF_CLOSURE=true ,允许半关闭socket即可。默认为false,客户端shutdownoutput时,SocketChannel.read(..) 接收到 -1 时,会关闭整个channel。
0
O
OSC_STkKUW
我用mina做服务端的时候也碰到这样的问题了,客户端调用shutdownoutput方法后,服务端iosession获取不到客户端地址了,客户端收不到返回报文信息,也不报错,请问mina有什么配置参数或其它方法解决这一问题吗?
野渡无人舟自横
野渡无人舟自横
看上楼,mina没仔细研究过,不过应该是类似的
返回顶部
顶部