A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangxin540 中级黑马   /  2013-9-9 00:29  /  972 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangxin540 于 2013-9-10 08:52 编辑

在用TCP进行客户端和服务器之间的数据传输时,有时需要客户端给服务器端结束标记服务器端的循环才能停下来,但是有时也不需要客户端给服务器端发送结束标记就能停下来。这个结束标记到底在什么时候使用,求解。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

3 个回复

正序浏览
本帖最后由 doitforyou 于 2013-9-10 00:37 编辑

总的来说,何时定义标记,主要看客户端循环结束后,服务端依然处于阻塞即读取状态,如果会处于阻塞状态,则需要定义标记,如果不是阻塞状态,则不需要定义标记。具体如下:
何时不需要定义标记:
如果客户端发送数据循环结束,执行到Socket关闭之前没有遇到阻塞状态时,如没有遇到read()方法等,则不需要定义标记,因为客户端close方法执行后,服务端也会结束循环。
何时需要定义标记:
当客户端和服务端进行Socket网络传输时,如果客户端发送数据循环结束后继续执行,遇到read()方法读取服务端反馈信息时,会处于阻塞状态,此时则需要定义标记,来告知服务端我数据传输完毕,使服务端停止等待读取状态,继续往下执行,发送确认信息。
定义标记的两种方法:
1.自定义标记(tomcat服务器会用到,建议掌握):可以定义字符串或者时间戳作为结束标记,字符串易和文本内容重复,不建议;时间戳是唯一的,具体使用方法可参照视频。
2.Socket本身自带的方法:shutdownInput()、shutdownOutput(),对象直接使用即可。
回复 使用道具 举报
你说的是毕老师视频里用shutdownOutput()方法停止服务器端循环读取的情况吧?
我们定义循环停止的条件是接收到结束标记(-1),一般客户端发送完信息,直接关闭(客户端调用close()方法)会自动给服务器发送一个结束标记,服务器端的读取循环就结束,继续向下运行。
需要主动发送结束标记的例子里,客户端发送数据结束没有直接关闭,而是先等待读取服务器端的返回信息(read()方法)。这时客户端没发送结束信息,服务器端还处于循环中,也没办法给客户端返回信息。这样两边都在等待,程序就不能动了。
这时候就要在客户端发送完数据之后,在读到read方法进入等待之前,调用shutdownOutput()关闭客户端的输出流,发送一个结束标记给服务端让它结束循环。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
断开连接其实不论是客户端和服务器端,任何一方都可以调用close(or closesocket)之类
的函数开始主动终止一个连接。这里先暂时说正常情况。当调用close函数断开一个连接时,主动断开的
一方发送FIN(finish报文给对方。也就是一个设置了FIN标志位的报文段),作用是释放连接。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马