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(); 问题成功就解决了。 至于为什么,由于小弟知识浅薄,没研究过源码,故不能深刻的理解,以上如有理解错误,望指正。

0 0
原创粉丝点击