readLine读取socket流的时候产生了阻塞

BufferedReader的readLine方法,只要读到流结束或者流关闭,就会返回null

在读取文件的时候,文件结尾就是流的结尾,但对于Socket而言不是的。不能认为流中数据读完了就是流的结尾了。Socket流还在,还是能够继续读写的。所以用Socket的输入流封装的BufferedReader调用readLine方法,是不会返回null的。也就发生阻塞了。

解决方案:

第一种:读取socket流不用BufferedReader,就用InputStream

第二种:客户端发送的时候,末尾添加换行符。取系统换行符  System.lineSeparator()

注意:

使用readLine读取一行数据,并不是很好的方式。因为并不知道这一行到底有多大。理论上是可以被恶意攻击的。

对于网络编程而言,请求与响应的数据格式要约定好。

①   每次都读取固定大小

②   每次读取的报文大小由报文头决定

时间: 2024-11-16 06:10:15

readLine读取socket流的时候产生了阻塞的相关文章

IO流 写入转换流(写入和读取转换流的区别,考虑方向)

package com.yyq; import java.io.*; /* 读取转换流(InputStreamReader) 是字节通向字符的桥梁 * 写入的时候是字节,但是读取的时候是字符,这叫做字节转字符 * 写入转换流(OutputStreamWriter)是字符流通向字节流的桥梁?? * 录入的时候是字符,存储的时候总是字节,这就叫做字符转字节 */ public class OutPutStreamWriterDemo { public static void main(String[

文件_ _android从资源文件中读取文件流并显示的方法

======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private void doRaw(){ InputStream is = this.getResources().openRawResource(R.raw.ziliao); try{ doRead(is); }catch(IOException e){ e.printStackTrace(); } } pri

FFmpeg命令读取RTMP流如何设置超时时间

子标题:FFmpeg命令录制RTMP流为FLV文件时如何设置超时时间 | FFmpeg命令如何解决录制产生阻塞的问题   0x001: 前言 今天在测试程序时遇到两个问题.Q1:ffmpeg录制RTMP流并保存为FLV文件时,推RTMP流的线程已经结束断掉了,而录制的线程却还一直在录.Q2:ffmpeg录制RTMP流并保存为FLV文件时,被录制的RTMP流并未推流或并无此房间频道,而录制的线程却还一直在录. 观察日志文件发现录制程序一直阻塞在某个时间点上,经查验这是因为ffmpeg在拉取RTMP

读Socket流时产生阻塞的解决方案

在用socket写一个服务器时遇到了问题于是将主要的问题抽了出来,代码如下,由于代码很简单于是也没有注释. public class Main { private static ServerSocket serverSocket; private final static ExecutorService exec = Executors.newFixedThreadPool(30); public static void main(String[] args) { try { serverSoc

C#循环读取文件流,按行读取

public Dictionary<string,string> GetSourceDisksElements(String section) { section = "[" + section; Dictionary<string, string> keyToValue = new Dictionary<string, string>(); //打开文件流,开始读取文件 using (StreamReader sin = new StreamRea

java 读取文件流

搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStream 此抽象类是表示字节输入流的所有类的父类.InputSteam是一个抽象类,它不可以实例化. 数据的读取需要由它的子类来实现.根据节点的不同,它派生了不同的节点流子类 . 继承自InputSteam的流都是用于向程序中输入数据,且数据的单位为字节(8 bit).       常用方法: int

socket流的问题

webservice底层就是基于socket编程的,当客户端IO未关闭时,服务端无法正常接收客户端请求: 服务端程序: 正常关流的客户端程序: 可以看到,服务端正常接收到客户端的请求,如未正常关流: 服务端接收到的数据为“null”.

【幻化万千戏红尘】qianfengDay20-java基础学习:数据流、随机读取文件流RandomAccessFile

课程回顾: 流:转换流:字符和字节的转换对象流(Object):序列化,反序列化 打印流(Print):打印各种数据类型的数据 今日内容:数据流(Data):支持将基本数据类型写出,字节流,处理流1.DataOutputStream:数据输出字节流常用方法:writeXXX:写出基本数据类型的数据writeUTF:写出字符串2.DataInputStream:数据输入字节流常用方法:readXXX:读取基本数据类型的数据readUTF:读取字符串 随机读取文件类:拥有写出和读取基本数据类型的方法

读取HttpWebResponse流的两种方法及注意的问题

1.  获取流 HttpWebRequest request= (HttpWebRequest)WebRequest.Create(uri); //构建http request     request.Method = "get";     HttpWebResponse response = (HttpWebResponse)hwr.GetResponse();    //发出请求并获得Response     resStream = response.GetResponseStre