《OnlineChat996》基于微信群聊的在线实时通信工具


项目源码:你和我的畅聊时光


一、主要功能

  1. 注册,成为我们的注册会员用户,你将拥有全网唯一的ID。
  2. 登录,进入拥有千万好友的畅聊空间。
  3. 私聊,你可以选择和任意在线用户进行一次亲密对话。
  4. 群聊,只要你想,没有不可以。你们的团体就是一个小群组。

二、具体实现

1.服务器与客户端的连接

服务器加载所有的配置信息,包括数据库的密码等。服务器根据Socket与客户端连接,服务器根据收到的不同类型信息而进行不同的操作。如1代表用户注册操作。
1.注册:将用户信息存储到服务器。登录后将新上线的用户信息发回给当前已在线的所有用户。
2.私聊:服务器会检测到所有的私聊信息以及发送方和接收方。
3.注册群:群名和群成员信息存储在Map集合中。
4.群聊:服务器会接收到所有的群聊消息,并发送给群聊内的每一个用户。

public class MultiThreadServer {
   
    private static final String IP;
    private static final int PORT;
    // 缓存当前服务器所有在线的客户端信息
    private static Map<String, Socket> clients = new ConcurrentHashMap<>();
    // 缓存当前服务器注册的所有群名称以及群好友
    private static Map<String,Set<String>> groups = new ConcurrentHashMap<>();
    static {
   
        Properties pros = CommUtils.loadProperties("socket.properties");
        IP = pros.getProperty("address");
        PORT = Integer.parseInt(pros.getProperty("port"));
    }

    private static class ExecuteClient implements Runnable {
   
        private Socket client;
        private Scanner in;
        private PrintStream out;

        public ExecuteClient(Socket client) {
   
            this.client = client;
            try {
   
                this.in = new Scanner(client.getInputStream());
                this.out = new PrintStream(client.getOutputStream(),
                        true,"UTF-8");
            } catch (IOException e) {
   
                e.printStackTrace();
            }
        }
        @Override
        public void run() {
   
            while (true) {
   
                if (in.hasNextLine()) {
   
                    String jsonStrFromClient = in.nextLine();
                    MessageVO msgFromClient =
                            (MessageVO) CommUtils.json2Object(jsonStrFromClient,
                                    MessageVO.class);
                    // 新用户注册到服务端
                    if (msgFromClient.getType().equals("1")) {
   
                        String userName = msgFromClient.getContent();
                        // 将当前在线的所有用户名发回客户端
                        MessageVO msg2Client = new MessageVO();
                        msg2Client.setType("1");
                        msg2Client.setContent(CommUtils.object2Json(
                                clients.keySet()
                        ));
                        out.println(CommUtils.object2Json(msg2Client));
                        // 将新上线的用户信息发回给当前已在线的所有用户
                        sendUserLogin("newLogin:"+userName);
                        // 将当前新用户注册到服务端缓存
                        clients.put(userName,client);
                        System.out.println(userName+"上线了!");
                        System.out.println("当前聊天室共有"+
                                clients.size()+"人");
                    }
                    else if (msgFromClient.getType().equals("2")) {
   
                        // 用户私聊
                        // type:2
                        //  Content:myName-msg
                        //  to:friendName
                        String friendName = msgFromClient.getTo();
                        Socket clientSocket = clients.get(friendName);
                        try {
   
                            PrintStream out = new PrintStream(clientSocket.getOutputStream(),
                                    true,"UTF-8");
                            MessageVO msg2Client = new MessageVO();
                            msg2Client.setType("2");
                            msg2Client.setContent(msgFromClient.getContent());
                            System.out.println("收到私聊信息,内容为"+msgFromClient.getContent());
                            out.println(CommUtils.object2Json(msg2Client));
                        } catch (IOException e) {
   
                            e.printStackTrace();
                        }
                    }else if (msgFromClient.getType().equals("3")) {
   
                        // 注册群
                        String groupName = msgFromClient.getContent();
                        // 该群的所有群成员
                        Set<String> friends = (Set<String>) CommUtils.json2Object(
                                msgFromClient.getTo(),Set.class);
                        groups.put(groupName,friends);
                        System.out.println("有新的群注册成功,群名称为"+
                                groupName+",一共有"+groups.size() + "个群");
                    }else if (msgFromClient.getType().equals("4")) {
   
                        // 群聊信息
                        System.out.println("服务器收到的群聊信息为:"+msgFromClient);
                        String groupName = msgFromClient.getTo();
                        Set<String> names = groups.get(groupName);
                        Iterator<String> iterator = names.iterator();
                        while (iterator.hasNext()) {
   
                            String socketName = iterator.next();
                            Socket client = clients.get(socketName);
                            try {
   
                                PrintStream out = new PrintStream(client.getOutputStream(),
                                        true,"UTF-8");
                                MessageVO messageVO = new MessageVO();
                                messageVO.setType("4");
                                messageVO.setContent(msgFromClient.getContent());
                                // 群名-[]
                                messageVO.setTo(groupName+"-"+CommUtils.object2Json(names));
                                out.println(CommUtils.object2Json(messageVO));
                                System.out.println("服务端发送的群聊信息为:"<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值