开发者社区> 问答> 正文

java socket阻塞的问题:报错


当server和client端同时通信时,看Server.java 的while循环里的语句,约定客户端传输的时候结束了在末尾加一个eof作为标识,推出循环。原文作者是这么描述他的作用的。

在上述代码中首先我们从输入流中读取客户端发送过来的数据,接下来我们再往输出流里面写入数据给客户端,接下来关闭对应的资源文件。而实际上上述代码可能并不会按照我们预先设想的方式运行,因为从输入流中读取数据是一个阻塞式操作,在上述的while循环中当读到数据的时候就会执行循环体,否则就会阻塞,这样后面的写操作就永远都执行不了了。除非客户端对应的Socket关闭了阻塞才会停止,while循环也会跳出。针对这种可能永远无法执行下去的情况的解决方法是while循环需要在里面有条件的跳出来,纵观上述代码,在不断变化的也只有取到的长度len和读到的数据了,len已经是不能用的了,唯一能用的就是读到的数据了。针对这种情况,通常我们都会约定一个结束标记,当客户端发送过来的数据包含某个结束标记时就说明当前的数据已经发送完毕了,这个时候我们就可以进行循环的跳出了

我不理解的是,从输入流中读取是一个阻塞操作,也就是输入流没发数据,他就一直在那里等,不往下执行。但是这个client.java明明write了一个hello,world字符串给他了啊。按理说,他读完了,自然会跳出while,为什么len = -1 的条件不会退出,而设一个eof,手动break???

展开
收起
kun坤 2020-06-06 23:13:57 654 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载