標籤:java-tcp tcp網路編程 tcp通訊 socket
先啟動 Server 端,進入一個死迴圈以便一直監聽某連接埠是否有串連請求。然後運行 Client 端,用戶端發出串連請求,服務端監聽到這次請求後向用戶端發回接受訊息,串連建立,啟動一個線程去處理這次請求,然後繼續死迴圈監聽其他請求。用戶端輸入字串後按斷行符號鍵,向伺服器發送資料。伺服器讀取資料後回複用戶端資料。這次請求處理完畢,啟動的線程消亡。如果用戶端接收到 “OK” 之外的返回資料,會再次發送串連請求並發送資料,伺服器會為這次串連再次啟動一個線程來進行響應。。。直到當用戶端接收到的返回資料為 “OK” 時,用戶端退出。
服務端代碼
import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class TCPServer { public static final int PORT = 12345;// 監聽的連接埠號碼 public static void main(String[] args) { System.out.println("伺服器啟動...\n"); TCPServer server = new TCPServer(); server.init(); } public void init() { try { ServerSocket serverSocket = new ServerSocket(PORT); while (true) { // 一旦有堵塞, 則表示伺服器與用戶端獲得了串連 Socket client = serverSocket.accept(); // 處理這次串連 new HandlerThread(client); } } catch (Exception e) { System.out.println("伺服器異常: " + e.getMessage()); } } private class HandlerThread implements Runnable { private Socket socket; public HandlerThread(Socket client) { socket = client; new Thread(this).start(); } public void run() { try { // 讀取用戶端資料 DataInputStream input = new DataInputStream( socket.getInputStream()); String clientInputStr = input.readUTF();// 這裡要注意和用戶端輸出資料流的寫方法對應,否則會拋 // EOFException // 處理用戶端資料 System.out.println("服務端收到:" + clientInputStr); // 向用戶端回複資訊 DataOutputStream out = new DataOutputStream( socket.getOutputStream()); System.out.println("服務端輸入:"); // 發送鍵盤輸入的一行 String s = new BufferedReader(new InputStreamReader(System.in)) .readLine(); out.writeUTF(s); out.close(); input.close(); } catch (Exception e) { System.out.println("伺服器 run 異常: " + e.getMessage()); } finally { if (socket != null) { try { socket.close(); } catch (Exception e) { socket = null; System.out.println("服務端 finally 異常:" + e.getMessage()); } } } } }}
用戶端代碼
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class TCPClient { public static final String IP_ADDR = "localhost";//伺服器位址 public static final int PORT = 12345;//伺服器連接埠號碼 public static void main(String[] args) { System.out.println("用戶端啟動..."); System.out.println("當接收到伺服器端字元為 \"OK\" 的時候, 用戶端將終止\n"); while (true) { Socket socket = null; try { //建立一個流通訊端並將其串連到指定主機上的指定連接埠號碼 socket = new Socket(IP_ADDR, PORT); //讀取伺服器端資料 DataInputStream input = new DataInputStream(socket.getInputStream()); //向伺服器端發送資料 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); System.out.println("用戶端輸入: "); String str = new BufferedReader(new InputStreamReader(System.in)).readLine(); out.writeUTF(str); String ret = input.readUTF(); System.out.println("用戶端接收: " + ret); // 如接收到 "OK" 則中斷連線 if ("OK".equals(ret)) { System.out.println("用戶端將關閉串連"); Thread.sleep(500); break; } out.close(); input.close(); } catch (Exception e) { System.out.println("用戶端異常:" + e.getMessage()); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { socket = null; System.out.println("用戶端 finally 異常:" + e.getMessage()); } } } } } }
測試結果
Java TCP網路編程 簡單一實例