久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么用java實現一個簡易的聊天室

154次閱讀
沒有評論

共計 3211 個字符,預計需要花費 9 分鐘才能閱讀完成。

要實現一個簡易的聊天室,可以使用 Java 的 Socket 編程實現。下面是一個簡單的實現示例:

服務器端代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {private ServerSocket serverSocket;
    private List<ClientHandler> clients = new ArrayList<>();

    public static void main(String[] args) {ChatServer server = new ChatServer();
        server.start(8888);
    }

    public void start(int port) {try {serverSocket = new ServerSocket(port);
            System.out.println(" 服務器已啟動,監聽端口:" + port);

            while (true) {Socket clientSocket = serverSocket.accept();
                System.out.println(" 客戶端已連接:" + clientSocket.getRemoteSocketAddress());

                // 創建一個新的客戶端處理器
                ClientHandler clientHandler = new ClientHandler(clientSocket);
                clients.add(clientHandler);
                clientHandler.start();}
        } catch (IOException e) {e.printStackTrace();
        }
    }

    public synchronized void broadcast(String message, ClientHandler excludeClient) {for (ClientHandler client : clients) {if (client != excludeClient) {client.sendMessage(message);
            }
        }
    }

    public synchronized void removeClient(ClientHandler client) {clients.remove(client);
    }

    private class ClientHandler extends Thread {private Socket clientSocket;
        private InputStream inputStream;
        private OutputStream outputStream;

        public ClientHandler(Socket clientSocket) {this.clientSocket = clientSocket;
        }

        @Override
        public void run() {try {inputStream = clientSocket.getInputStream();
                outputStream = clientSocket.getOutputStream();

                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {String message = new String(buffer, 0, bytesRead);
                    System.out.println(" 收到消息:" + message);

                    // 廣播消息給其他客戶端
                    broadcast(message, this);
                }
            } catch (IOException e) {e.printStackTrace();
            } finally {try {clientSocket.close();
                    removeClient(this);
                } catch (IOException e) {e.printStackTrace();
                }
            }
        }

        public void sendMessage(String message) {try {outputStream.write(message.getBytes());
                outputStream.flush();} catch (IOException e) {e.printStackTrace();
            }
        }
    }
}

客戶端代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class ChatClient {private Socket socket;
    private InputStream inputStream;
    private OutputStream outputStream;

    public static void main(String[] args) {ChatClient client = new ChatClient();
        client.connect("localhost", 8888);
    }

    public void connect(String serverAddress, int serverPort) {try {socket = new Socket(serverAddress, serverPort);
            System.out.println(" 已連接到服務器:" + serverAddress + ":" + serverPort);

            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();

            // 接收和發送消息的線程
            Thread receiveThread = new Thread(this::receiveMessages);
            Thread sendThread = new Thread(this::sendMessages);

            receiveThread.start();
            sendThread.start();} catch (IOException e) {e.printStackTrace();
        }
    }

    public void receiveMessages() {try {byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {String message = new String(buffer, 0, bytesRead);
                System.out.println(message);
            }
        } catch (IOException e) {e.printStackTrace();
        }
    }

    public void sendMessages() {Scanner scanner = new Scanner(System.in);
        try {while (true) {String message = scanner.nextLine();
                outputStream.write(message.getBytes());
                outputStream.flush();}
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

在命令行中,先運行服務器端的 ChatServer 類,再運行客戶端的 ChatClient 類??蛻舳丝梢暂斎胂?,然后服務器端會將消息廣播給其他客戶端。注意要將客戶端的 connect 方法中的 serverAddress 改為服務器的 IP 地址。

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-13發表,共計3211字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 申扎县| 班戈县| 鹿邑县| 临澧县| 北流市| 通化市| 红桥区| 永康市| 新源县| 封丘县| 襄垣县| 宁阳县| 于都县| 申扎县| 江口县| 康乐县| 湘潭市| 乐安县| 巨鹿县| 察雅县| 浦北县| 镇平县| 哈密市| 临安市| 江山市| 合川市| 泸州市| 科技| 达尔| 扶风县| 荆州市| 台中市| 寻甸| 武鸣县| 汾阳市| 浦东新区| 饶阳县| 武清区| 安岳县| 巫溪县| 保山市|