socket编程BufferReader.readLine()遇到的坑
来源:互联网 发布:java接口的定义 编辑:程序博客网 时间:2024/04/30 21:14
socket编程BufferReader.readLine()遇到的坑
最几天公司马上要上手一个项目需要用到Java对接硬件, 就是个停车场的智能管理项目,其实要与硬件进行通信, 听说jboos netty 不错。 就研究了两天 没研究出什么成果来, 可能是自己能力不足吧, 但看到有人说过《netty权威指南》这本书, 所以下载看了看, 因为感觉现在百度上关于entty的文章资料还不多, 也不够全面仔细。 好了 步入正题、 在看第二章作者介绍同步阻塞IO的时候, 有一个例子。 书上例子是这样的
public class TimeServer { public static void main(String[] args) throws IOException { int port = 8085; ServerSocket server = null; try { // 创建服务 server = new ServerSocket(port); System.out.println("The time server is start in port :"+port); Socket socket = null; while(true){ // 监听 socket = server.accept(); new Thread(new TimeServerHandler(socket)).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if(server != null){ server.close(); System.out.println("The time server is close!"); server = null; } } }}class TimeServerHandler implements Runnable{ private Socket socket = null; public TimeServerHandler(Socket socket ) { this.socket = socket; } @Override public void run() { // 字符读取缓存流 BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); out = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true); String currentTime = null; String body = null; while(true){ body = in.readLine(); if(body == null){ break; } System.out.println("The time server receive order:"+body); // 如果客户端发来的指令为:QUERY TIME ORDER 则返回当前时间, 否则返回 BAD ORDER 指令无效 currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body)?new Date().toString():"BAD ORDER"; } // 响应客户端 out.print(currentTime); } catch (Exception e) { e.printStackTrace(); } finally{ if(in != null){ try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } in = null; } if(out != null){ out.close(); out = null; } if(socket != null){ try { this.socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.socket = null; } } }}public class TimeClient { public static void main(String[] args) { Socket socket = null; BufferedReader in = null; PrintWriter out = null; try { socket = new Socket("rascal-guo", 8085); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true); out.println("QUERY TIME ORDER"); System.out.println("send order to server succeed!"); String resp = in.readLine(); System.out.println("Now time is : "+resp); } catch (Exception e) { e.printStackTrace(); } finally{ if(out != null){ out.close(); out = null; } if(in != null){ try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } in = null; } if(socket != null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } socket = null; } } }}
运行的时候却出现了问题,TimeServerHandler类body = in.readLine(); 这行代码第一次执行的时候没问题,但第二次执行时候 却到这阻塞了,一直就没往下执行。经过网上搜索,各种说法收集一下,然后凭着自己对代码的灵感进行了逐步的试修改,首先是在TimeClient类中out.println(“QUERY TIME ORDER\n”); 后面加了个换行符, 因为in.readLine()是逐行读取(根据换行符),可能服务端没读取到换行符所以一直在读取(………好像有点说不通)。 再次跑下服务端和客户端。发现服务端readLine()方法不在阻塞。但是第二次他还会读取“”空字符串出来,不能明白。既然不影响 程序顺利执行就不管啦, 第一个问题解决了,但是第二个问题又来了。 客户端打印服务端的响应是null,Now time is : null。 百思不得其解。根据我之前看的资料。感觉性的往服务端out.print(currentTime);的后面加上了out.flush(); 问题成功就解决了。 至于为什么,由于小弟知识浅薄,没研究过源码,故不能深刻的理解,以上如有理解错误,望指正。
- socket编程BufferReader.readLine()遇到的坑
- 使用BufferReader类的readLine()方法注意问题
- 关于BufferReader中readLine的问题!小心!
- BufferReader中的readLine()方法
- 如何从bufferreader reader.readline() 获取特定编码的字符串
- 使用readLine()方法遇到的坑
- JAVA socket编程(使用BufferedReader的readline()函数读取最后一行等待20S)
- JAVA Socket 编程的两个问题,readline(),判断Socket连接断掉
- Java socket编程时readLine()问题
- java socket编程中readline问题
- java socket编程中readline问题
- android socket readline()方法读不到值的问题
- java的TCP编程模型中遇到的PrintWriter、BufferedWriter与readLine()的问题
- socket网络编程(3)- socket网络编程遇到的问题
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- linux网络编程之socket(六):利用recv和readn函数实现readline函数
- Netty 疑问 1
- 神奇的 BlocksKit(1):源码分析
- html中的有序列表和无序列表
- java常用类
- 线程池
- socket编程BufferReader.readLine()遇到的坑
- 单链表的逆置
- PHP 秒数转换成时分秒的格式
- opencv中Mat的一些常见操作
- HDOJ 1430 魔板 (bfs+映射)
- 十二周实践项目2————Time类的运算
- gcd 简单操作解析
- Apache POI 3.14 发布
- 剑指Offer----面试题一:为类添加赋值运算符函数