使用readLine()方法遇到的坑
来源:互联网 发布:ansys软件什么语言 编辑:程序博客网 时间:2024/05/14 06:31
下午玩 TCP/IP 的 Socket 通信时,使用 BufferedReader 的 readLine() 遇到了一个坑,现在终于解决了,特此记录下来。
程序很简单,客户段从控制台读取用户输入,然后发送至服务器端,主要代码如下
客户端:
Socket s = new Socket("192.168.0.4", 20022); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//用户获取用户输入 OutputStream os = s.getOutputStream();//用于向服务器输出 System.out.println("请输入要发送的文字:"); String input; while ((input= reader.readLine()) != null) { os.write(input.getBytes("utf-8")); }
服务器端:
BuffedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));String content;while((content = reader.readLine() )!=null){ System.out.println("客户端数据:"+content);}
发现只有在客户端执行os.write()方法后,加上 os.close() 方法,服务器才能收到数据,但是这样会同时关闭客户端的 Socket ,所以只能传送一次,显然不是程序想要达到的目的。
在网上一番搜索,看到了这篇文章:被readLine()折腾了一把 ,豁然开朗。
原来readLine()方法在进行读取一行时,只有遇到回车(\r)或者换行符(\n)才会返回读取结果,这就是“读取一行的意思”,重要的是readLine()返回的读取内容中并不包含换行符或者回车符;
并且,当realLine()读取到的内容为空时,并不会返回 null,而是会一直阻塞,只有当读取的输入流发生错误或者被关闭时,readLine()方法才会返回null。
所以我的程序出现问题的原因找到了:
由于在客户端使用的readLine()来读取用户输入,所以当用户按下回车键是,readLine() 返回读取内容,
但此时返回的内容并不包含换行符,而当在服务器端用readLine()再次读取时,由于读取的内容没有换行符,所以readLine()方法会一直阻塞等待换行符,这就是服务器端没有输出的原因。
解决方法:在客户端每次输入回车后,手动给输入内容加入"\n"或"\r",再写入服务器;
while ((input = reader.readLine()) != null) { input = input+"\n";//手动加上回车 os.write(input.getBytes("utf-8")); }
或者在服务器端使用read()方法进行读取。
非常感谢 swingline 的文章:点击打开链接
- 使用readLine()方法遇到的坑
- read(), readline(), readlines()方法的使用
- read(), readline(), readlines()方法的使用
- socket编程BufferReader.readLine()遇到的坑
- readline库函数的使用
- readline库的使用
- readline的使用
- 关于JAVA中Console.readLine()方法的使用!
- Java学习笔记------BufferedLine类的readLine()方法 使用须知
- 使用BufferReader类的readLine()方法注意问题
- DataInputStream的过期方法readLine()
- LINUX readline 库的使用,,
- readLine()方法
- IOS下的readLine方法的实现
- BufferedReader的readLine方法阻塞的处理
- StreamReader.ReadLine 的方法读取指定行
- readLine方法的原理和案例分析
- 关于BufferefReader.readLine()方法的理解
- Filesystem 函数
- 时间复杂度
- Material Design系列--DrawerLayout
- xml doctype
- cut命令详解
- 使用readLine()方法遇到的坑
- 讯飞语音 objc-class-ref in iflyMSC(IFlyContact.o) ld: symbol(s) not found for archite
- spark2.0.2环境搭建(hadoop2.7.3)——启动关闭
- mnsit 手写数据集 python3.x的读入 以及利用softmax回归进行数字识别
- Ubuntu系统安装搜狗(sougou for linux)输入法详细教程
- opencv环境配置
- Vim文档编辑
- jq +ajax +thinkphp5实现分类选择
- 关于自定义drawable圆角,代码中动态修改边线及填充色