各位高手们:
小弟在使用ApacheMina做服务器,接收由客户端(客户端是设备,不能改)发送的数据时遇到的问题几个问题,还请各位帮忙。
1、测试过程中会发现客户端与服务器的连接会断开,但是服务器上的连接仍然存在。目前的解决方法是服务器定时给客户端发送查询指令,如果客户端长时间未返回数据则认为客户端掉线,服务器主动断开连接。不知道有没有其他更好的解决方式?
2、服务器日志经常看到日志报如下异常:客户端就会掉线,这样不能保持客户端与服务器的长连接,很容易出现数据漏报的现象。是不是我哪里的配置有问题?
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:273)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:44)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:690)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
3、在服务器的解码器中,会在对报文做校验,如果发现不符合规则,会返回MessageDecoderResult.NOT_OK,从而服务器会强制使客户端掉线。请问有没有办法在校验失败时不要让服务器把客户端踢下线。
in.position(15);
if(in.get() != (byte)0x00){
return MessageDecoderResult.NOT_OK;
}
if(in.get() != (byte)0x0A){
return MessageDecoderResult.NOT_OK;
}
in.position(20);
if(in.get() != (byte)0x00){
return MessageDecoderResult.NOT_OK;
}
return MessageDecoderResult.OK;
------解决方案--------------------
1、测试过程中会发现客户端与服务器的连接会断开,但是服务器上的连接仍然存在。目前的解决方法是服务器定时给客户端发送查询指令,如果客户端长时间未返回数据则认为客户端掉线,服务器主动断开连接。不知道有没有其他更好的解决方式?
发ping包来检测是最简单的方法了,一般都是客户端定时发心跳包
2、服务器日志经常看到日志报如下异常:客户端就会掉线,这样不能保持客户端与服务器的长连接,很容易出现数据漏报的现象。是不是我哪里的配置有问题?
看这个异常,好像是客户端异常关了socket导致的,应该和服务器的配置无关
3、在服务器的解码器中,会在对报文做校验,如果发现不符合规则,会返回MessageDecoderResult.NOT_OK,从而服务器会强制使客户端掉线。请问有没有办法在校验失败时不要让服务器把客户端踢下线。
服务器除非是关连接,否则单凭这种返回标志位是不可能强制客户端断开连接的
------解决方案--------------------
1. 如果客户端真正断了TCP连接,会在Iohandler上面产生一个SessionClosed,你通过这个事件去处理该处理的事情不就OK了嘛?当然,一般长连接的应用都会去定时的发PING消息,但这个PING消息是构建在原来的TCP连接之上的私有消息封装。如果你客户端改不了,基本上也就加不了消息了。
2.3两个问题同1楼。
3,再补充一下,估计这种情况 是你返回了错误之后,客户端断的。
当然,从楼主的描述来看,多数是楼主接了一个摊子,但对这个摊子里的边边角角也不是特别的熟悉吧。