利用 Socket 實現服務器客戶端聊天

Socket是網絡編程中最基本的通信接口,常用的網絡輔助類,比如URL等之類,其底層還是基於Socket來實現的。

而Socket,形象來說,就是連接通信的兩端,比如這樣 S<==>S,中間的通道就是網絡了,而簡單地利用Socket,我們就可以來實現一個簡單的聊天功能

具體效果看下圖:


這只是在本地中試用的效果,如果加上UI界面,其實就可以做成一個聊天的小應用了。

1. Server 端主要是利用ServerSocket的accept方法來等待客戶端的連接,如果客戶一直沒有連接,則會在這裏等待,直到客戶端請求到來。

而客戶端就是一個Socket,當客戶端請求到來的時候,accept會返回一個Socket對象, 這就是S<==>S中的左邊那個S了,可以利用其InputStream和OutputStream來進行讀寫了,讀就是接收信息,而寫就是回覆信息。

  1. public class Server {  
  2.   
  3.     public static void main(String[] args) {  
  4.         try {  
  5.             ServerSocket server = new ServerSocket(9999);  
  6.             Helper.println("Server started, waiting for message.");  
  7.             Socket client = server.accept();  
  8.             PrintWriter pw = null;  
  9.             while (true) {  
  10.                 BufferedReader br = new BufferedReader(new InputStreamReader(  
  11.                         client.getInputStream()));  
  12.                 String content = br.readLine();  
  13.                 if (content.equals("end")) {  
  14.                     server.close();  
  15.                     br.close();  
  16.                     if (pw != null) {  
  17.                         pw.close();  
  18.                     }  
  19.                     break;  
  20.                 }  
  21.                 Helper.println(content);  
  22.                 Helper.print("Server:");  
  23.                 pw = new PrintWriter(client.getOutputStream(), true);  
  24.                 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));  
  25.                 String output = "Server : " + in.readLine();  
  26.                 pw.println(output);  
  27.                 pw.flush();  
  28.             }  
  29.             Helper.println("Client left! Server Closed.");  
  30.         } catch (IOException e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35. }  

2. Client端就是一個Socket,並定義一個連接的地址和端口,地址表明是網絡中哪一臺主機,而端口則表明了是主機中的那個應用程序,很顯然就是上面Server這個應用,因爲其定義了其等待監聽的端口就是9999。當創建了一個Socket對象,並指定了地址和端口的時候,其實就已經發送了一個請求去對應的Server,請求連接,而如果連接成功,就可以繼續下去,不然直接拋出異常。當然,這裏連接成功,必須是Server先在監聽了。
  1. public class Client {  
  2.   
  3.     public static void main(String[] args) {  
  4.         try {  
  5.             Socket client = new Socket("127.0.0.1"9999);  
  6.             PrintWriter pw = null;  
  7.             InputStreamReader isr = null;  
  8.             Helper.println("Client started, ready to write content.");  
  9.             String input = "";  
  10.             while (true) {  
  11.                 Helper.print("Client : ");  
  12.                 InputStream is = System.in;  
  13.                 input = new BufferedReader(new InputStreamReader(is))  
  14.                         .readLine();  
  15.                 pw = new PrintWriter(client.getOutputStream(), true);  
  16.                 pw.println("Client:" + input);  
  17.                 if (input.equals("end")) {  
  18.                     client.close();  
  19.                     is.close();  
  20.                     pw.close();  
  21.                     if (isr != null) {  
  22.                         isr.close();  
  23.                     }  
  24.                     break;  
  25.                 }  
  26.                 isr = new InputStreamReader(client.getInputStream());  
  27.                 Helper.println(new BufferedReader(isr).readLine());  
  28.             }  
  29.             Helper.println("Client stopped!");  
  30.         } catch (IOException e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35.   
  36. }  

嗯,結束。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章