一对多聊天服务器

服务器设计

1.服务器的连接设计

2.服务器的线程设计

创建一对多聊天服务应用
java 复制代码
/**
 * 接收客户端消息的线程类
 */
class ChatReceive extends Thread {
    private Socket socket;
    public ChatReceive(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run(){
        this.receiveMsg();
    }
    /**
     * 实现接收客户端发送的消息
     */
    private void reveiveMsg(){
        try(BufferedReader br = new BufferedReader(new InputStreamReader(this.socket.getInputStream()))
        ){
            while(true){
                String msg = br.readLine();
                synchronized("abc"){
                    //把读取到的数据写入公共数据区
                    ChatRoomServer.buf="["+this.socket.getInetAddress()+"] "+msg;
                    //唤醒发送消息的线程对象
                    "abc".notifyAll();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

/**
 * 向客户端发送消息的线程类
 */
class ChatSend extends Thread {
    private Socket socket;
    public ChatSend(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run(){
        this.sendMsg();
    }
    /**
     * 将公共数据区的消息发送给客户端
     */
    private void sendMsg(){
        try(PrintWriter pw = new PrintWriter(this.socket.getOutputStream())
        ){
            while(true){
                synchronized("abc"){
                    //让发送消息的线程处于等待状态
                    "abc".wait();
                    //将公共数据区中的消息发送给客户端
                    pw.println(ChatRoomServer.buf);
                    pw.flush();
                }
            }
        }catch(Exeception e){
            e.printStackTrace();
        }
    }
}

public class ChatRoomServer {
    //定义公共数据区
    public static String buf;
    public static void main(String[] args){
        System.out.println("Chat Server Version 1.0");
        System.out.println("Listen at 8888");
        try(ServerSocket serverSocket = new ServerSocket(8888)
        ){
            while(true){
                Socket socket = ServerSocket.accept();
                System.out.println("连接到:"+socket.getInetAddress());
                new ChatReceive(socket).start();
                new ChatSend(socket).start();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
相关推荐
小此方5 分钟前
Re:Linux系统篇(二十二)进程篇·七:环境变量的底层溯源、核心获取机制与安全应用
linux·运维·服务器
天空属于哈夫克39 分钟前
私域社群自动化:用自动化接口做外部群的主动发送
运维·自动化·企业微信·api
Cloud_Shy61812 分钟前
Linux 系统权限知识及应用实践
linux·运维·服务器·centos·云计算
kjmkq16 分钟前
2026智算中心液冷服务器机房建设标准及常见方案对比
运维·服务器
腾讯蓝鲸智云19 分钟前
【运维自动化-节点管理】资源配额功能如何使用
运维·服务器·自动化·云计算
一氧化二氢.h23 分钟前
Linux手动脚本 vs Dockerfile部署:核心区别与适用场景
linux·运维·服务器
茉莉清茶LG23 分钟前
Xshell成功创建了Ubuntu连接,但是显示虚拟机连接断开了,连接失败。
linux·运维·ubuntu
cvcode_study41 分钟前
Nginx 基础
运维·nginx
程序员JerrySUN42 分钟前
Jetson边缘嵌入式实战课程第五讲:Jetson Secure Boot - 安全启动
android·linux·服务器·人工智能·安全·unity·游戏引擎
SAP女战士1 小时前
【SAP FICO&MM】物料与总账科目之间的关系
运维·sap fico