开发者社区> 问答> 正文

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 650 0
1 条回答
写回答
取消 提交回答
  • 他们是一直链接的,并没有断开哦,所以要我们自己规定一个字符来假设发送完了一句话,就像我们的句号一样,就用了eof。所以你读取数据为 -1这可能吗?######回复 @雨翔河 : 明白了。感谢######回复 @plugin : 这是一个传输带,一直在运输东西,没有结尾的,除非你中断了它。比如你读取一个文件,文件是有一个结尾标致的,SOCKET不一样,两边握手了就是一直在通信了,没有什么结尾标致,只能人为规定比如说再见,那么就表示我要走了,说你好,就说明我来了,除非中断这个连接。######这个和单纯的io流读取有什么区别吗?io流中我记得读取read一次,得到hello,world,再读的话,到末尾了就得到-1,这时候就可以跳出循环了。有什么区别吗

    2020-06-06 23:14:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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