免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3939 | 回复: 18
打印 上一主题 下一主题

请教一个关于Socket的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-08 15:52 |只看该作者 |倒序浏览
我用serverSocket.accept()方法创建了一个Socket,用于和客户端通信。

用“BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())) ”接管了“socket.getInputStream()”。

然后用“in.readLine()”阻塞的方式获取客户端的数据。

当客户端断开时,会抛出“IOException”,然后进行相应的处理,没问题。

现在的问题是,如果客户端(Linux)在使用过程中重新启动机器,服务程序并不抛出异常,就是说还阻塞在“in.readLine()”中!导致程序无法正常处理。

大家遇到过吗?我该怎么知道它重新启动时断开了连接?

论坛徽章:
0
2 [报告]
发表于 2006-02-09 09:44 |只看该作者
哦?

论坛徽章:
0
3 [报告]
发表于 2006-02-09 10:17 |只看该作者
各位,如果没有答案,我就要改成不阻塞的方式了!

论坛徽章:
0
4 [报告]
发表于 2006-02-09 10:53 |只看该作者
应该会抛出connection reset的错误,
java.net.SocketException: Connection reset

是用
while (true) {
    String str = in.readLine();
}
这样的方式阻塞的么?

论坛徽章:
0
5 [报告]
发表于 2006-02-09 11:30 |只看该作者
请问下什么方式不阻塞?

论坛徽章:
0
6 [报告]
发表于 2006-02-09 11:34 |只看该作者
原帖由 cooljia 于 2006-2-9 10:53 发表
应该会抛出connection reset的错误,
java.net.SocketException: Connection reset

是用
while (true) {
    String str = in.readLine();
}
这样的方式阻塞的么?


1、不会抛任何异常!
2、不是,in.readLine()自己就会阻塞。

问题解决了,我使用了Socket的Timeout,即用“socket.setSoTimeout(3 * 60 * 1000);”,当超时时会中断in.readLine()的阻塞,并抛出“Read timed out”,这时再进行处理就OK了。

感谢大家。

论坛徽章:
0
7 [报告]
发表于 2006-02-09 11:36 |只看该作者
原帖由 艾斯尼勒 于 2006-2-9 11:30 发表
请问下什么方式不阻塞?


我一般用“BufferedInputStream”的“available()”来判断是否有数据,有数据再接收,这时就不阻塞了。

论坛徽章:
0
8 [报告]
发表于 2006-02-09 12:31 |只看该作者
不推荐使用in.readLine()方法阻塞,如果没有数据传输,应该关闭socket,有数据时重新创建socket连接。你不能寄望socket建立的连接永远有效。用soTimeout万一对方没有出错,只是一段时间没有发送数据,你也把它关掉了,这也是不对的。

论坛徽章:
0
9 [报告]
发表于 2006-02-09 12:35 |只看该作者

回复 7楼 我是好人 的帖子

关注中

论坛徽章:
0
10 [报告]
发表于 2006-02-09 13:34 |只看该作者
重启客户端linux server不会发送TCP RST么? 有点模糊...期望哪位大侠给个准确答案

如果用SO_TIMEOUT选项的话, 客户端如果正好在这段时间内没有消息, 怎么办?
如果楼主的想法只是期望判断client是否crash, shutdown等等, 完全可以在server端的socket使用SO_KEEPALIVE socket option, 对应于java程序就是socket.setKeepAlive(true), 不过注意一下这是两小时侦测一次(而且还是implementation dependent)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP