一、多線程網絡編程(TCP協議)
1.客戶端
- 創建Socket連接服務端(指定ip地址,端口號)通過ip地址找對應的服務器
- 調用Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
- 輸入流可以讀取服務端輸出流寫出的數據
- 輸出流可以寫出數據到服務端的輸入流
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 12345);
//將字節流包裝成了字符流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//PrintStream中有寫出換行的方法
PrintStream ps = new PrintStream(socket.getOutputStream());
System.out.println(br.readLine());
ps.println("你好");
System.out.println(br.readLine());
ps.println("大家好");
socket.close();
}
注:
- 此處不適用BufferedWriter的原因:BufferedReader中readLine()方法以讀入換行符(\r\n)爲結束標誌,而PrintStream中的println()方法比BufferedWriter中newLine()方法更加方便,所以此處推薦使用PrintStream。
- PrintStream必須使用println()輸出,如果使用print()方法可能導致死鎖。
2.服務器
- 創建ServerSocket(需要指定端口號)
- 調用ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
- 調用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流
- 輸入流可以讀取客戶端輸出流寫出的數據
- 輸出流可以寫出數據到客戶端的輸入流
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(12345);
while(true) {
final Socket socket = server.accept(); //接受客戶端的請求
new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //將字節流包裝成了字符流
PrintStream ps = new PrintStream(socket.getOutputStream()); //PrintStream中有寫出換行的方法
ps.println("你好");
System.out.println(br.readLine());
ps.println("再見");
System.out.println(br.readLine());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}