网络何时失效(完美解决追加200分)---socket的另一方关闭或者异常断开程序该如何知道 可以假定客户收到c1000@@!@!@!#@!#数据的时候必须在10秒内回送一个'Kkkk(*&3493"否则认为客户已经断线,断开连接,这个就是协议 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务器端要求客户端定时发送空数据包过来,如果没收到相应客户端的数据包!关闭socket!还可以在服务器端直接多每个socket进行连接超时设置,详细见JDK API 说明Socket部分! 1.手动设置协议,如接收到"disconnect"则断开连接2.socket.setSoTimeout(Timeout); //设置超时 考虑用其他通信模型,例如各平台均支持的SELECT。如果你不用它并使用非阻塞就不能单单以READ返回0来判断是否断线,如果能与客户端保持协议就最好,但因为你客户端不是自己写的所以没办法,有一个方法不知道可行不,在服务器端记录每个SOCKET的数据收发时间,开一个线程检查每个SOCKET的时间是否超过一定范围的时间,如果是则CLOSE并移除记录。 定时接受客户端发过来的消息,要是发生异常,根据异常判断Socket是否断开~~~~~~~~ 专业的搜索引擎技术提供商(磐志搜索),访问www.panzhi.net了解详细介绍。 JAVA 爱好者加群 38236097JAVA 爱好者加群 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只是为选择该键,并且由于没有数据供写入或读出,根本不会发生异常!服务器不能主动关闭连接,除非确定这个客户端已经断开! zoeg(沉香),你的邮箱是多少?我发邮箱跟你交流吧! 看这里,向一个已经关闭了的Client写东西会报错:使用非阻塞IO读取时,如果客户端已经关闭,它会立刻报错而不是读取不到任何东西。即如果客户端已经关闭,再对从集合中取出的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();} 加密解密高手帮忙 GZIP压缩所有子目录以及子目录底下的文件问题 请问这个this是什么意思 用JAVA把CSV文件导入SQL2005 String str=new String("abc");到底创建了几个对象?? String字符串的问题 JCreator 3.5中的CVS如何使用呀,请高手指点一下!!! 请问java到底有多强?能做局域网下的文件共享吗?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();
}