1. 程式人生 > >java Socket實現簡單線上聊天(二)

java Socket實現簡單線上聊天(二)

接《Java Socket實現簡單線上聊天(一)》,在單客戶端連線的基礎上,這裡第二步需要實現多客戶端的連線,也就需要使用到執行緒。每當有一個新的客戶端連線上來,服務端便需要新啟動一個執行緒進行處理,從而解決之前的迴圈讀取中造成阻塞的問題。

寫執行緒通常有兩種方法,整合Thread或者實現runnable介面,原則上是能實現runnable的情況下就不繼承,因為實現介面的方式更加靈活。
客戶端程式碼相較之前沒有變化,變得是服務端,因此這裡便只貼出服務端程式碼:
  1. package chat.chat;  
  2. import java.io.DataInputStream;  
  3. import java.io.EOFException;  
  4. import java.io.IOException;  
  5. import java.net.BindException;  
  6. import java.net.ServerSocket;  
  7. import java.net.Socket;  
  8. import java.net.SocketException;  
  9. /** 
  10.  * java使用socket和awt元件以及多執行緒簡單實現線上聊天功能服務端 : 實現多個客戶端連線後不斷向服務端傳送訊息, 
  11.  * 相對於第一個版本,重點在於使用了多執行緒。服務端還未實現轉發功能,客戶端圖形視窗中只能看到自己輸入的資訊, 不能看到其他客戶端傳送的訊息 
  12.  *  
  13.  * @author tuzongxun123
     
  14.  * 
  15.  */
  16. publicclass ChatServer {  
  17.     publicstaticvoid main(String[] args) {  
  18.         new ChatServer().start();  
  19.     }  
  20.     // 是否成功啟動服務端
  21.     privateboolean isStart = false;  
  22.     // 服務端socket
  23.     private ServerSocket ss = null;  
  24.     // 客戶端socket
  25.     private Socket socket = null;  
  26.     publicvoid start() {  
  27.         try
     {  
  28.             // 啟動伺服器
  29.             ss = new ServerSocket(8888);  
  30.         } catch (BindException e) {  
  31.             System.out.println("埠已在使用中");  
  32.             // 關閉程式
  33.             System.exit(0);  
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.         try {  
  38.             isStart = true;  
  39.             while (isStart) {  
  40.                 // 啟動監聽
  41.                 socket = ss.accept();  
  42.                 System.out.println("one client connect");  
  43.                 // 啟動客戶端執行緒
  44.                 Client client = new Client(socket);  
  45.                 new Thread(client).start();  
  46.             }  
  47.         } catch (Exception e) {  
  48.             e.printStackTrace();  
  49.         } finally {  
  50.             // 關閉服務
  51.             try {  
  52.                 ss.close();  
  53.             } catch (IOException e) {  
  54.                 e.printStackTrace();  
  55.             }  
  56.         }  
  57.     }  
  58.     /** 
  59.      * 客戶端執行緒 
  60.      *  
  61.      * @author tuzongxun123 
  62.      * 
  63.      */
  64.     class Client implements Runnable {  
  65.         // 客戶端socket
  66.         private Socket socket = null;  
  67.         // 客戶端輸入流
  68.         private DataInputStream dataInputStream = null;  
  69.         privateboolean isConnect = false;  
  70.         public Client(Socket socket) {  
  71.             this.socket = socket;  
  72.             try {  
  73.                 isConnect = true;  
  74.                 // 獲取客戶端輸入流
  75.                 dataInputStream = new DataInputStream(socket.getInputStream());  
  76.             } catch (IOException e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.         }  
  80.         @Override
  81.         publicvoid run() {  
  82.             isConnect = true;  
  83.             try {  
  84.                 while (isConnect) {  
  85.                     // 讀取客戶端傳遞的資料
  86.                     String message = dataInputStream.readUTF();  
  87.                     System.out.println("客戶端說:" + message);  
  88.                 }  
  89.             } catch (EOFException e) {  
  90.                 System.out.println("client closed!");  
  91.             } catch (SocketException e) {  
  92.                 System.out.println("Client is Closed!!!!");  
  93.             } catch (Exception e) {  
  94.                 e.printStackTrace();  
  95.             } finally {  
  96.                 // 關閉相關資源
  97.                 try {  
  98.                     dataInputStream.close();  
  99.                     socket.close();  
  100.                 } catch (IOException e) {  
  101.                     e.printStackTrace();  
  102.                 }  
  103.             }  
  104.         }  
  105.     }