在Socket编程中,我们经常会创建Socket连接后。获取InputStream和OutputStream,并进一步包装以便方便的进行数据的读取或写入操作。
但是,如果流使用的不对,就可能会产生无法读取到数据的情况。
下面是使用BufferedWriter和PrintWriter需要注意的地方。
1.使用BufferedReader和BufferedWriter
如果使用BufferedReader和BufferedWriter来一次读取或写入一行数据,必须要加\n,代表一行结束。否则BufferedReader读取不到数据。
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。
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);