Java Socket編程之TCP編程
全套的:https://www.yuque.com/shizhiy...
基礎:https://blog.51cto.com/wangdy/1588379
Java Socket編程基礎及深入講解:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html
- TCP協議是面向連接的、可靠的、有序的、以字節流的方式發送數據,通過三次握手方式建立連接,形成傳輸數據的通道,在連接中進行大量數據的傳輸,效率會稍低
-
Java中基於TCP協議實現網絡通信的類
- 客戶端的Socket類
- 服務器端的ServerSocket類
- Socket通信的步驟
① 創建ServerSocket和Socket
② 打開連接到Socket的輸入/輸出流
③ 按照協議對Socket進行讀/寫操作
④ 關閉輸入輸出流、關閉Socket
- 服務器端:
① 創建ServerSocket對象,綁定監聽端口
② 通過accept()方法監聽客戶端請求
③ 連接建立後,通過輸入流讀取客戶端發送的請求信息
④ 通過輸出流向客戶端發送鄉音信息
⑤ 關閉相關資源
**
/**
* 基於TCP協議的Socket通信,實現用戶登錄,服務端
*/
//1、創建一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口
ServerSocket serverSocket = new ServerSocket(10086);//1024-65535的某個端口
//2、調用accept()方法開始監聽,等待客戶端的連接
Socket socket = serverSocket.accept();
//3、獲取輸入流,並讀取客戶端信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是服務器,客戶端說:" + info);
}
socket.shutdownInput();//關閉輸入流
//4、獲取輸出流,響應客戶端的請求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("歡迎您!");
pw.flush();
//5、關閉資源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
- 客戶端:
① 創建Socket對象,指明需要連接的服務器的地址和端口號
② 連接建立後,通過輸出流想服務器端發送請求信息
③ 通過輸入流獲取服務器響應的信息
④ 關閉響應資源
//客戶端
//1、創建客戶端Socket,指定服務器地址和端口
Socket socket =newSocket("localhost",10086);
//2、獲取輸出流,向服務器端發送信息
OutputStream os = socket.getOutputStream();//字節輸出流
PrintWriter pw =newPrintWriter(os);//將輸出流包裝成打印流
pw.write("用戶名:admin;密碼:123");
pw.flush();
socket.shutdownOutput();
//3、獲取輸入流,並讀取服務器端的響應信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!null){
System.out.println("我是客戶端,服務器說:"+info);
}
//4、關閉資源
br.close();
is.close();
pw.close();
os.close();
socket.close();
- 應用多線程實現服務器與多客戶端之間的通信
① 服務器端創建ServerSocket,循環調用accept()等待客戶端連接
② 客戶端創建一個socket並請求和服務器端連接
③ 服務器端接受苦讀段請求,創建socket與該客戶建立專線連接
④ 建立連接的兩個socket在一個單獨的線程上對話
⑤ 服務器端繼續等待新的連接
//服務器線程處理
//和本線程相關的socket
Socket socket =null;
//
public serverThread(Socket socket){
this.socket = socket;
}
publicvoid run(){
//服務器處理代碼
}
//============================================
//服務器代碼
ServerSocket serverSocket =newServerSocket(10086);
Socket socket =null;
int count =0;//記錄客戶端的數量
while(true){
socket = serverScoket.accept();
ServerThread serverThread =newServerThread(socket);
serverThread.start();
count++;
System.out.println("客戶端連接的數量:"+count);
}
[鏈接]()