代码实现简单的多人聊天室和私聊

一共有三个类,源码在最后,以下是一 一 分析:

在这里插入图片描述
在这里插入图片描述

匿名内部类构建线程

/**
     * @author thx
     * @description 匿名内部类消息线程
     * @yyds: thx yyds
     * @date 2021/9/23 9:38
     */
    class MsgThread extends Thread {

        private DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //    当前客户端
        private Socket socket;
		// 构造器
        public MsgThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
//        接受客户端信息
            try {
                while (true) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
                    // 这里注意,匿名内部类的变量都是 final 的,不可被改变
                    final String msg = reader.readLine();
                    //                  判断是群聊还是私聊
                    if (msg.contains("-")) {
                    //是私聊,通过 lambda 和 流,找到单独发送的端口号的 socket 对象
                        clients.stream().filter((c) -> c.getPort() == Integer.parseInt(msg.split("-")[0])).forEach((s) -> {
                            try {
                                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream(), "utf-8"));
                                writer.write(msg + "\n");
                                writer.flush();
                                serverSendOne(msg, s);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        });
                        //是群聊,直接对所有发东西消息即可
                    } else {
                        serverSendAll(msg);
                    }

                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

在这里插入图片描述

服务端分析完了,然后是客户端,其实客户端就是输入消息,得到消息的过程:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

接受数据和发送数据都是死循环

源码:

聊天室类,新建聊天服务:

public class ChatRoom {
    public static void main(String[] args) throws IOException {
        new ChatRoomServer().start();
    }
}

客户端类,客户端接收消息给服务端,服务端再返回给各个客户端

public class ChatRoomClient {
    private Socket socket;
    private static DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//    构造器
    public ChatRoomClient() {
        try {
            socket = new Socket("localhost", 12345);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("客户端" + socket.getPort() + "已经启动");
    }

    public void start() {
//        发送消息
        new ClientSendThread().start();
//      接收消息
        new ClientReceiveThread().start();
    }

    //    专门负责发送消息
    private class ClientSendThread extends Thread {
        @Override
        public void run() {
            try {
                System.out.println("如果直接发言,就是给所有人");
                System.out.println("私聊格式 port-聊天内容 ");
                Scanner sc = new Scanner(System.in);
               while (true) {
                   String msg = sc.next();
//            需要向所有的用户发消息
                   BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
                   bufferedWriter.write(msg + "\n");
                   bufferedWriter.flush();
               }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //    专门负责接收消息
    private class ClientReceiveThread extends Thread {
        @Override
        public void run() {
            try {
                while (true) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
                    System.out.println("客户端发送 " + reader.readLine() + " 时间" + format.format(new Date()));

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new ChatRoomClient().start();
    }
}

服务端核心部分:

public class ChatRoomServer {
    private static DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    private ServerSocket serverSocket;
    //    定义一个容器,存放所有的客户端
    private List<Socket> clients;

    //定义构造器,初始化信息
    public ChatRoomServer() {
        //        创建服务器
        try {
            serverSocket = new ServerSocket(12345);
            //        服务器已经启动
            System.out.println("服务器[" + serverSocket.getLocalPort() + "]启动成功,等待客户访问");
            clients = new ArrayList<>();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() throws IOException {
//        等待客户端访问
        while (true) {
            Socket socket = serverSocket.accept();
            clients.add(socket);
//            开始启动发送消息线程
            new MsgThread(socket).start();
//            判断是群聊还是私聊
            serverSendAll("用户【" + socket.getPort() + "】进入聊天室");
        }

    }
    public void serverSendAll(String msg) {
        for (Socket client : clients) {
            try {//            开始向客户端发送信息
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), "utf-8"));
                bufferedWriter.write(msg + "\n");
                bufferedWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void serverSendOne(String msg, Socket socket) {
        try {//            开始向客户端发送信息
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
            bufferedWriter.write(msg + "\n");
            bufferedWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @author thx
     * @description 匿名内部类消息线程
     * @yyds: thx yyds
     * @date 2021/9/23 9:38
     */
    class MsgThread extends Thread {

        private DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //    当前客户端
        private Socket socket;

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

        @Override
        public void run() {
//        接受客户端信息
            try {
                while (true) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
//                    String msg = "客户端[" + socket.getPort() + "]发送 " + reader.readLine() + " 时间" + format.format(new Date());
                    final String msg = reader.readLine();
                    //                  判断是群聊还是私聊
                    if (msg.contains("-")) {
                        clients.stream().filter((c) -> c.getPort() == Integer.parseInt(msg.split("-")[0])).forEach((s) -> {
                            try {
                                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream(), "utf-8"));
                                writer.write(msg + "\n");
                                writer.flush();
                                serverSendOne(msg, s);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        });
                    } else {
                        serverSendAll(msg);
                    }

                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python socket 实现的多人聊天室是一个可以供多个用户进行实时通信的网络应用程序。可以通过 Python 脚本编写实现,通过 socket 套接字进行基于 TCP 协议的网络通信。在聊天室中,用户可以发送和接收消息,可以与其他用户进行私聊或者群聊,还可以通过管理员设定的权限进行其他操作,例如踢出用户、禁言等。 要实现 Python socket 多人聊天室,需要了解 socket 编程的基本原理,如套接字、IP 地址、端口等相关知识。在编写代码时,首先需要初始化服务器端套接字,并设置 IP 地址和端口号。当客户端套接字连接到服务器端后,服务器端就会发送欢迎消息,告诉客户端连接成功,并进入聊天室。 接下来,服务器端需要监听客户端的消息,并将其广播给其他所有的客户端。此时,需要注意到客户端可能会有不同的请求,例如发送消息、私聊、退出聊天室等。因此,需要编写不同的处理函数,根据不同的请求类型对消息进行处理。 此外,在实现多人聊天室的过程中,还需要考虑到多个客户端同时连接的情况。服务器端需要记录每个客户端的套接字和相关信息,以及维护一个客户端列表,以便在广播消息时向所有客户端发送。 总之,Python socket 实现的多人聊天室是一个有趣的项目,需要使用 Python 相关库和技术来实现,可以锻炼网络编程和服务器端开发的能力。在实际运用中,也可以作为一个大型客户端-服务器端应用程序的基础,提供实时通信的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_努力努力再努力_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值