BufferedReader 的 readLine 方法,只要读到流结束或者流关闭,就会返回 null
在读取文件的时候,文件结尾就是流的结尾,但对于 Socket 而言不是的。不能认为流中数据读完了就是流的结尾了。Socket 流还在,还是能够继续读写的。所以用 Socket 的输入流封装的 BufferedReader 调用 readLine 方法,是不会返回 null 的。也就发生阻塞了。
解决方案:
第一种:读取 socket 流不用 BufferedReader,就用 InputStream
第二种:客户端发送的时候,末尾添加换行符。取系统换行符 System.lineSeparator ()
注意:
使用 readLine 读取一行数据,并不是很好的方式。因为并不知道这一行到底有多大。理论上是可以被恶意攻击的。
对于网络编程而言,请求与响应的数据格式要约定好。
① 每次都读取固定大小
② 每次读取的报文大小由报文头决定
网友评论