1. 程式人生 > >Socket程式設計使用IO流需要注意的地方

Socket程式設計使用IO流需要注意的地方

在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);