Chinaunix

标题: google 了一晚上也没能解决的java中的socket问题 [打印本页]

作者: 望月乘凉    时间: 2007-06-12 20:44
标题: google 了一晚上也没能解决的java中的socket问题
一个java编写的client端程序,如何知道socket连接已经关闭,这里有一个很重要的前提就是这个client程序不允许调用读或者写这样的方法来激发socket的异常!!!

不要告诉我用 isConnected  isClosed  getKeepAlive  getHosName(是不是这么写的忘了,反正就是获得server端地址之类的方法),这些方法都是狗屎,我看了一下他们的实现,也实际试验了一下,都是假值!!!

我觉得这种应用非常常见,不是所有的程序都会被允许读或者写socket通道的,比如一个监控线程,他的功能定位就是及时发现socket连接是否中断,如果中断及时重建,而不能干扰正常的程序去读或者写这个socket通道!!!

我这个问题,我自己抽象成为:“当Server端主动关闭或者被强行kill掉时,Client端的程序除了调用读或者写这样的方法以外,还有没有别的方法可以激发出socket异常,以便最终可以被程序扑获并判断出socket已经关闭????”

我找了一晚上,没搞定,希望各位帮忙想想,至少在C程序里我是可以通过select函数实现的,没有理由java这个东东实现不了,,,太不可思议了!!!是不是需要使用某些特别的类了呢??
作者: gxcooo    时间: 2007-06-13 10:36
在某些情况下,操作系统的TCP/IP栈都不知道对方已经出了问题
这些情况包括中间路由中断,对方机器断电/死机等等
可以使用SO_KEEPALIVE,不过两个小时太长了
作者: ua    时间: 2007-06-14 11:38
java 也有 select ,看看 nio那一块儿
作者: jeffwang8001    时间: 2007-06-14 13:02
不允许调用读或者写这样的方法来激发socket的异常!!!

这样的话,还真是没啥好办法,至少我不知道。
楼下的有知道的,指点一下
作者: gungunlove    时间: 2007-06-14 13:46
你可以上www.ojava.net看看。。。

-------------------------------------
上海咨路教育中心
3G移动开发精品示范班
www.zilu.org
作者: perryhg    时间: 2007-06-18 13:19
如果是长时间空闲,那要保持连接干嘛?还不如每次干完就关闭连接,需要时重新连接。
作者: xiangya    时间: 2007-07-08 09:24
从你说话的样子和事情来看,还有态度,一个字, “很差”。别的词语不好意思说出口。
api/java/nio/channels/SelectionKey.html#OP_READ
OP_READ

public static final int OP_READ

    Operation-set bit for read operations.

    Suppose that a selection key's interest set contains OP_READ at the start of a selection operation. If the selector detects that the corresponding channel is ready for reading, has reached end-of-stream, has been remotely shut down for further reading, or has an error pending, then it will add OP_READ to the key's ready-operation set and add the key to its selected-key set.
同样,OP_WRITE也有同样的条件说明。
好好看看吧。心高气傲,可以,心浮气躁,否矣。
作者: heusun    时间: 2007-07-08 21:28
  support level 7




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2