可以假定客户收到c1000@@!@!@!#@!#数据的时候必须在10秒内回送一个'Kkkk(*&3493"否则认为客户已经断线,断开连接,这个就是协议
解决方案 »
- 表格组件刷新
- 求助:怎样用ECLIPSE或别的方法修改某些开源框架的源码
- jar可执行文件之诡异问题
- 一个parseFloat(String str)的问题
- 画出函数y=10*sin(x)中的值(可以通过打点的方法在-2π---2π画出图形)
- 这个问题很奇怪!!!
- 狂急,如何从字符串取出相应的字段 StringTokenizer st = new StringTokenizer(record,",");
- 初学JAVA,帮看看
- 哪里有比较好的JAVA反编器?
- 怎么能把一台服务器的文件上传到另外一台服务器(难)
- 这段代码为什么输出0d0a,而不是0a,我已经使用了字节流操作了。
- swing里面有类似windows记事本中设置字体的组件吗?还是要自己写?
还可以在服务器端直接多每个socket进行连接超时设置,详细见JDK API 说明Socket部分!
2.socket.setSoTimeout(Timeout); //设置超时
JAVA 爱好者加群 38236097
不能通过阻塞在Socket.read方法,当抛出异常时将其断开!
----------------------------------------------------为什么不能,不要以为NEW I/O读取一个关闭了的Socket时不会抛出异常,而是什么也读不到。
你这样解理是错误的。新IO一样会抛出异常。
“服务器永远也不会关闭连接,它等待客户端中断Socket。当Socket中断时,会抛出一个异常。”这是《java网络编程》第三版399页一个句话,详见第十二章 非阻塞I/O 中ChargenServer.java。
楼上说的那本书,我找了份英文的看了一下(没有页脚),似乎那个ChargenServer的例子也没有针对这方面的处理!
另外,“不能通过阻塞在Socket.read方法,当抛出异常时将其断开!”我说这句话不是说做不到,而是由于需求或者其他原因,不能在读取某个连接的时候阻塞这个线程。
也可能是对你的回复理解有误,希望能给出更具体的处理方式,若确实解决,300分一定奉上!
示例如下:在一个循环体内执行如下代码段:
Set selectedKeys=selector.selectedKeys();
Iterator iterator=selectedKeys.iterator();
while(iterator.hasNext()){
SelectionKey selectionKey=(SelectionKey)iterator.next();
try{
if(!selectionKey.isValid()) destroy(selectionKey);
if(selectionKey.isAcceptable()) accept(selectionKey,selector);
if(selectionKey.isConnectable()) connect(selectionKey);
if(selectionKey.isReadable()) read(selectionKey);
if(selectionKey.isWritable()) write(selectionKey);
}catch(Exception e){
destroy(selectionKey);
}
iterator.remove();
}
如此来在单个线程中实现为多客户端服务,所有的通道被设置为非阻塞模式。当客户端关闭或者断开时,selector只是为选择该键,并且由于没有数据供写入或读出,根本不会发生异常!
服务器不能主动关闭连接,除非确定这个客户端已经断开!
我发邮箱跟你交流吧!
即如果客户端已经关闭,再对从集合中取出的selector进行操作就会报错。
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = (ByteBuffer) key.attachment();
try {
client.write(buffer);
} catch (IOException e) {
org.apache.log4j.Logger.getLogger(ChargenServer.class)
.info("向通道写buffer时出错,Client端可能已经关闭。"+e.getMessage());
// 客户端断开时,再读取会抛出异常
key.cancel(); // 取消对应的键
try {
key.channel().close();// 关闭对应的通道
} catch (IOException cex) {
}
e.printStackTrace();
}