java Socket實現簡單線上聊天(二)
阿新 • • 發佈:2019-01-05
接《Java Socket實現簡單線上聊天(一)》,在單客戶端連線的基礎上,這裡第二步需要實現多客戶端的連線,也就需要使用到執行緒。每當有一個新的客戶端連線上來,服務端便需要新啟動一個執行緒進行處理,從而解決之前的迴圈讀取中造成阻塞的問題。
寫執行緒通常有兩種方法,整合Thread或者實現runnable介面,原則上是能實現runnable的情況下就不繼承,因為實現介面的方式更加靈活。客戶端程式碼相較之前沒有變化,變得是服務端,因此這裡便只貼出服務端程式碼:
- package chat.chat;
- import java.io.DataInputStream;
- import java.io.EOFException;
- import java.io.IOException;
- import java.net.BindException;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.net.SocketException;
- /**
- * java使用socket和awt元件以及多執行緒簡單實現線上聊天功能服務端 : 實現多個客戶端連線後不斷向服務端傳送訊息,
- * 相對於第一個版本,重點在於使用了多執行緒。服務端還未實現轉發功能,客戶端圖形視窗中只能看到自己輸入的資訊, 不能看到其他客戶端傳送的訊息
- *
- * @author tuzongxun123
- *
- */
- publicclass ChatServer {
- publicstaticvoid main(String[] args) {
- new ChatServer().start();
- }
- // 是否成功啟動服務端
- privateboolean isStart = false;
- // 服務端socket
- private ServerSocket ss = null;
- // 客戶端socket
- private Socket socket = null;
- publicvoid start() {
- try
- // 啟動伺服器
- ss = new ServerSocket(8888);
- } catch (BindException e) {
- System.out.println("埠已在使用中");
- // 關閉程式
- System.exit(0);
- } catch (Exception e) {
- e.printStackTrace();
- }
- try {
- isStart = true;
- while (isStart) {
- // 啟動監聽
- socket = ss.accept();
- System.out.println("one client connect");
- // 啟動客戶端執行緒
- Client client = new Client(socket);
- new Thread(client).start();
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- // 關閉服務
- try {
- ss.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 客戶端執行緒
- *
- * @author tuzongxun123
- *
- */
- class Client implements Runnable {
- // 客戶端socket
- private Socket socket = null;
- // 客戶端輸入流
- private DataInputStream dataInputStream = null;
- privateboolean isConnect = false;
- public Client(Socket socket) {
- this.socket = socket;
- try {
- isConnect = true;
- // 獲取客戶端輸入流
- dataInputStream = new DataInputStream(socket.getInputStream());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- publicvoid run() {
- isConnect = true;
- try {
- while (isConnect) {
- // 讀取客戶端傳遞的資料
- String message = dataInputStream.readUTF();
- System.out.println("客戶端說:" + message);
- }
- } catch (EOFException e) {
- System.out.println("client closed!");
- } catch (SocketException e) {
- System.out.println("Client is Closed!!!!");
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- // 關閉相關資源
- try {
- dataInputStream.close();
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }