Socket與Writer
Prerequisites:
在串流基礎提過,串流有二種,一種是位元組串流,一種是字元串流。
讀取寫入的位置有二種,一種是檔案,一種是記憶體緩衝區。
Socket存取與寫入的位置都是在記憶體緩衝區,而且是位元組串流。
要把Socket位元組串流轉成字元串流,需要使用轉換串流(OutputStreamWriter,InputStreamReader)。
flowchart LR
位元組串流 -- 轉 --> 轉換串流 -- 轉 --> 字元串流
因為Socket存取與寫入的位置都在記憶體,所以需要使用Buffered字元串流(BufferedWriter,BufferedReader)。
重要的方法介紹
flush()
字元串流要使用flush()方法,把記憶體緩衝區的資料送到socket.OutputStream。
Client傳送文字
傳送步驟如下:
- 取得socket的OutputStream。
- 透過轉換串流取得BufferedWriter。
- 寫入文字。
- flush,通知伺服器已傳送完成。
- 關閉串流。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ClientWriter {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 9999);
OutputStream os = socket.getOutputStream();
// OutputStreamWriter是轉換串流,把位元組串流轉成字元串流
// BufferedWriter 寫入的位置都在記憶體緩衝區
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
writer.write("哈囉。 Server");
writer.newLine();
writer.write("hi");
// 告訴Server傳輸完畢
writer.flush();
// 關閉串流
writer.close();
os.close();
socket.close();
}
}
Server接收文字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ServerReader {
public static void main(String[] args) throws IOException {
// 設定監聽的port number
ServerSocket serverSocket = new ServerSocket(9999);
// accept會一直等待有人連上,有人連上會傳回socket物件
Socket socket = serverSocket.accept();
// socket包含客戶端傳送的資料,用InputStream取得
InputStream is = socket.getInputStream();
// InputStreamReader是轉換串流,把位元組串流轉成字元串流
// BufferedReader 讀取的位置都在記憶體緩衝區
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
is.close();
socket.close();
serverSocket.close();
}
}
執行程式
- 先執行Server
- 再執行Client