Socket程式設計使用IO流需要注意的地方
阿新 • • 發佈:2019-01-02
在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);