黑马程序员技术交流社区

标题: 关于TCP [打印本页]

作者: yangxin540    时间: 2013-9-9 00:29
标题: 关于TCP
本帖最后由 yangxin540 于 2013-9-10 08:52 编辑

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

作者: stormdzh    时间: 2013-9-9 01:00
断开连接其实不论是客户端和服务器端,任何一方都可以调用close(or closesocket)之类
的函数开始主动终止一个连接。这里先暂时说正常情况。当调用close函数断开一个连接时,主动断开的
一方发送FIN(finish报文给对方。也就是一个设置了FIN标志位的报文段),作用是释放连接。
作者: yangjie    时间: 2013-9-9 03:06
你说的是毕老师视频里用shutdownOutput()方法停止服务器端循环读取的情况吧?
我们定义循环停止的条件是接收到结束标记(-1),一般客户端发送完信息,直接关闭(客户端调用close()方法)会自动给服务器发送一个结束标记,服务器端的读取循环就结束,继续向下运行。
需要主动发送结束标记的例子里,客户端发送数据结束没有直接关闭,而是先等待读取服务器端的返回信息(read()方法)。这时客户端没发送结束信息,服务器端还处于循环中,也没办法给客户端返回信息。这样两边都在等待,程序就不能动了。
这时候就要在客户端发送完数据之后,在读到read方法进入等待之前,调用shutdownOutput()关闭客户端的输出流,发送一个结束标记给服务端让它结束循环。
作者: doitforyou    时间: 2013-9-10 00:35
本帖最后由 doitforyou 于 2013-9-10 00:37 编辑

总的来说,何时定义标记,主要看客户端循环结束后,服务端依然处于阻塞即读取状态,如果会处于阻塞状态,则需要定义标记,如果不是阻塞状态,则不需要定义标记。具体如下:
何时不需要定义标记:
如果客户端发送数据循环结束,执行到Socket关闭之前没有遇到阻塞状态时,如没有遇到read()方法等,则不需要定义标记,因为客户端close方法执行后,服务端也会结束循环。
何时需要定义标记:
当客户端和服务端进行Socket网络传输时,如果客户端发送数据循环结束后继续执行,遇到read()方法读取服务端反馈信息时,会处于阻塞状态,此时则需要定义标记,来告知服务端我数据传输完毕,使服务端停止等待读取状态,继续往下执行,发送确认信息。
定义标记的两种方法:
1.自定义标记(tomcat服务器会用到,建议掌握):可以定义字符串或者时间戳作为结束标记,字符串易和文本内容重复,不建议;时间戳是唯一的,具体使用方法可参照视频。
2.Socket本身自带的方法:shutdownInput()、shutdownOutput(),对象直接使用即可。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2