在Socket编程中,我们经常会创建Socket连接后。获取InputStream和OutputStream,并进一步包装以便方便的进行数据的读取或写入操作。
但是,如果流使用的不对,就可能会产生无法读取到数据的情况。

下面是使用BufferedWriter和PrintWriter需要注意的地方。

1.使用BufferedReader和BufferedWriter

如果使用BufferedReader和BufferedWriter来一次读取或写入一行数据,必须要加\n,代表一行结束。否则BufferedReader读取不到数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BufferedReader br = null;
BufferedWriter pw = null;
try {
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    pw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    while (true) {
        String input = br.readLine();
        if (null == input) {
            break;
        }
        System.out.println("接收到客户端请求:" + input);
        if ("Server Time".equalsIgnoreCase(input)) {
            // 注意:这里使用了BufferedWriter,必须要加\n,否则对方的BufferedReader的readLine()获取不到数据。
            pw.write((new Date()).toString()+"\n");
            pw.flush();
        }
    }
} catch (IOException e) {
	System.out.println("ip:" + socket.getInetAddress().getHostAddress() + " I/O异常");
}

2.使用BufferedReader和PrintWriter

仍然是使用BufferedReader一次读取一行数据,写数据用PrintWriter的println()方法。同时在构造PrintWriter时设置autoFlush=true。

1
2
3
4
5
6
7
8
9
socket = new Socket(host,port);
in = socket.getInputStream();
out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out),true); // 这里设置autoFlush=true
BufferedReader br = new BufferedReader(new InputStreamReader(in));
System.out.println("请求服务器时间");
pw.println("Server Time"); // 使用println写数据,不要使用write()
String response = br.readLine();
System.out.println("response:" + response);