Java编码实现聊天功能


实现一个简单的聊天功能可以通过Java的Socket编程来完成。下面将介绍如何使用Java编写一个基本的客户端-服务器聊天应用程序。此应用程序允许多个客户端连接到服务器,并在客户端之间进行消息传递。

架构概述

服务器端(Server):负责监听客户端连接,接收来自客户端的消息,并将消息广播给所有连接的客户端。
客户端(Client):连接到服务器,发送消息给服务器,并接收来自服务器的广播消息。

实现步骤

服务器端

使用ServerSocket监听特定端口。
接受客户端连接,并为每个客户端创建一个新的线程进行处理。
维护一个客户端列表,便于广播消息。
客户端

使用Socket连接到服务器。
启动一个线程用于接收来自服务器的消息。
允许用户通过控制台输入消息并发送到服务器。

代码实现

1. 服务器端代码 (ChatServer.java)
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;

public class ChatServer {
   
   
    private static final int PORT = 12345;
    // 使用线程安全的集合来存储客户端输出流
    private static Set<PrintWriter> clientWriters = ConcurrentHashMap.newKeySet();

    public static void main(String[] args) {
   
   
        System.out.println("聊天服务器启动,监听端口 " + PORT);
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
   
   
            while (true) {
   
   
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("新客户端连接: " + clientSocket);
                // 启动新的线程处理客户端
                new Thread(new ClientHandler(clientSocket)).start();
            }
        } catch (IOException e) {
   
   
            System.err.println("服务器异常: " + e.getMessage());
            e.printStackTrace();
        }
    }

    // 处理每个客户端的线程
    private static class ClientHandler implements Runnable {
   
   
        private Socket socket;
        private PrintWriter out;
        private BufferedReader in;

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

        public void run() {
   
   
            try {
   
   
                // 设置输入输出流
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream(), true);
                // 将输出流添加到集合中
                clientWriters.add(out);

                String message;
                // 读取来自客户端的消息,并广播
                while ((message = in.readLine()) != null) {
   
   
                    System.out.println("收到消息: " + message);
                    broadcast(message);
                }
            } catch (IOException e) {
   
   
                System.err.println("客户端连接异常: " + e.getMessage());
            } finally {
   
   
                // 清理资源
                try {
   
   
                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FuncPlotCalc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值