java socket實現多客戶端群聊

fmms 12年前發布 | 108K 次閱讀 Java開發 java socket

服務器端主要是接收客戶端發送過來的信息,并將該信息發給所有的客戶端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**

  • */ class Chat extends Thread { private Socket socket; private List<Socket> socketList; private int count;

    public Chat(int count, Socket socket, List<Socket> socketList) {

    this.count = count;
    this.socket = socket;
    this.socketList = socketList;
    

    }

    public void run() {

    BufferedReader reader = null;
    PrintWriter writer = null;
    try {
        reader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
    
        String message = null;
        while (true) {
            message = reader.readLine();
            // 接收到客戶端的bye信息,客戶端即將退出,并將bye寫入到該客戶端
            if (message.equals("bye")) {
                writer = new PrintWriter(socket.getOutputStream());
                writer.println("bye");
                writer.flush();
                continue;
            }
    
            // 向所有的客戶端發送接收到信息,實現群聊
            for (int i = 0; i < socketList.size(); i++) {
                writer = new PrintWriter(socketList.get(i)
                        .getOutputStream());
                writer.println(count + " say: " + message);
                writer.flush();
            }
    
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    } }

public class ChatServer {

/**
 * Description
 * 
 * @param args
 */
public void startWork() throws IOException {
    ServerSocket serverSocket = new ServerSocket(2345);
    List<Socket> socketList = new ArrayList<Socket>();
    Socket socket = null;
    int count = 0;
    while (true) {
        socket = serverSocket.accept();
        count++;
        System.out.println(count + " clinet connected to the server!");
        // 將每一個連接到該服務器的客戶端,加到List中
        socketList.add(socket);
        // 每一個連接到服務器的客戶端,服務器開啟一個新的線程來處理
        new Chat(count, socket, socketList).start();
    }
}

/**
 * Description
 * 
 * @param args
 * @throws IOException
 */
public static void main(String[] args) throws IOException {
    ChatServer chatServer = new ChatServer();
    chatServer.startWork();
}

}</pre>客戶端主要是兩個類,一個是接收服務器端發送過來的信息,一個是向服務器發送客戶端輸入的信息

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**

  • 接受服務器信息 */ class ReadMes extends Thread { private Socket socket;

    public ReadMes(Socket socket) {

     this.socket = socket;
    

    }

    public void run() {

     BufferedReader reader = null;
     try {
         reader = new BufferedReader(new InputStreamReader(
                 socket.getInputStream()));
         String message = null;
         while (true) {
             message = reader.readLine();
             // 當讀服務器信息線程接收到bye,該線程退出
             if (message.equals("bye")) {
                 break;
             }
             System.out.println(message);
         }
     } catch (IOException e) {
         e.printStackTrace();
     } finally {
         try {
             if (reader != null) {
                 reader.close();
             }
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
    

    }

}

/**

  • 發送信息 */ class SendMes extends Thread { private Socket socket;

    public SendMes(Socket socket) {

     this.socket = socket;
    

    }

    public void run() {

     BufferedReader input = null;
     PrintWriter writer = null;
     try {
         input = new BufferedReader(new InputStreamReader(System.in));
         writer = new PrintWriter(socket.getOutputStream());
         String message = null;
         while (true) {
             message = input.readLine();
             // 當輸入bye客戶端退出
             if (message.equals("bye")) {
                 break;
             }
             // 向服務器端發送信息
             writer.println(message);
             writer.flush();
         }
     } catch (IOException e) {
         e.printStackTrace();
     } finally {
         if (input != null) {
             try {
                 input.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         if (writer != null) {
             writer.close();
         }
     }
    

    } }

public class ChatClient { private String ipAdress;

public ChatClient(String ipAString) {
    this.ipAdress = ipAdress;
}

public void startWork() throws UnknownHostException, IOException {
    Socket socket = new Socket(ipAdress, 2345);
    new ReadMes(socket).start();
    new SendMes(socket).start();


}

/**
 * Description
 * 
 * @param args
 * @throws UnknownHostException
 * @throws IOException
 */
public static void main(String[] args) throws UnknownHostException,
        IOException {
    ChatClient chatClient = new ChatClient(args[0]);
    chatClient.startWork();
}

}</pre>

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!