网络多线程开发小项目--QQ登陆聊天功能(拉取在线用户列表功能)

2024-01-09 18:36:29

9.1.2、拉取在线用户列表功能

QQClient:

0、cn.com.agree.qqcommon.MessageType

package cn.com.agree.qqcommon;

/**
 * @author 
 * @version 1.0
 * @ClassName MessageType
 * @Description TODO 类描述
 * @date 2024/1/5  10:35 上午
 **/
public interface MessageType {

    //消息类型
    //1、在消息类型中定义一些常量
    //2、不同的常量值代表不同的消息类型
    String MESSAGE_LOG_SUCCESS = "1";//表示登陆成功
    String MESSAGE_LOG_FAIL = "2";//表示登陆失败
    String MESSAGE_COMM_MS="3";//普通消息
    String MESSAGE_GET_ONLINE_FIRED="4";//要求返回在线用户列表
    String MESSAGE_RET_ONLINE_FIRED="5";//返回在线用户列表
    String MESSAGE_CLIENT_EXIT="6";//客户端请求退出
}

1、界面QQView

 if (user != null) {
                        System.out.println("==========欢迎" + userId + "用户=============");
                        while (loop) {
                            System.out.println("==========网络通讯系统二级菜单(用户 " + userId + ")============");
                            System.out.println("=======\t\t 1 显示在线用户列表================");
                            System.out.println("=======\t\t 2 群发消息\t\t================");
                            System.out.println("=======\t\t 3 私聊消息\t\t================");
                            System.out.println("=======\t\t 4 发送文件\t\t================");
                            System.out.println("=======\t\t 9 退出系统\t\t================");
                            log.debug("请输入你的选择:");
                            key = Utility.readString(1);
                            switch (key) {
                                case "1":
                                    //System.out.println("显示在线用户列表");
                                    userClientService.DisplayOnlineUserList();
                                    break;
                                case "2":
                                    System.out.println("群发消息");
                                    break;
                                case "3":
                                    System.out.println("私聊消息");
                                    break;
                                case "4":
                                    System.out.println("发送文件");
                                    break;
                                case "9":
                                    loop = false;
                                    break;
                                default:
                                    log.debug("输入有误,请重新输入!");
                                    break;
                            }
                        }

                    } else {
                        log.debug("=========用户名密码错误=============");
                        log.debug("==========登陆失败=============");
                    }
                    break;
                case "9":
                    loop = false;
                    break;
                default:
                    log.debug("输入有误,请重新输入!");
                    break;
            }
 }

2、cn.com.agree.qqclient.service.UserClientService

public void DisplayOnlineUserList(){
        //构建要发送的信息 MESSAGE_GET_ONLINE_FIRED
        Message message = new Message();
        message.setMsgType(MessageType.MESSAGE_GET_ONLINE_FIRED);
        message.setGetter(user.getUserId());
        ObjectOutputStream oos;
        //获取该用户的socket输出流
        try {
            oos = new ObjectOutputStream(ManageClientConnectServers.getClientConnectServer(user.getUserId()).getSocket().getOutputStream());
            oos.writeObject(message);

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

    }

3、cn.com.agree.qqclient.service.ClientConnectServer

@Override
    public void run() {
        //因为Thread需要在后台和服务器进行通信,因此我们用while循环
        while (true) {
            try {
                log.debug("客户端线程和服务端正在通信,读取从服务端发来的消息...");
                // 设置Socket的超时时间为5000毫秒(5秒)
//                socket.setSoTimeout(5000);
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();//如果服务器端没有消息发过来这个线程一直会阻塞在这里
                //todo 后续对读取到的message进行处理
                switch (message.getMsgType()){
                    case MessageType.MESSAGE_RET_ONLINE_FIRED:
                        String[] userList = message.getContent().split(" ");
                        log.debug("====获取到的在线用户列表=====");
                        for (String user : userList) {
                            log.debug("user:{}",user);
                        }
                        break;
                    default:
                        log.debug("其他消息类型暂不处理");
                        break;

                }
                log.debug("message:{}",message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

QQServer:
0、cn.com.agree.qqcommon.MessageType

package cn.com.agree.qqcommon;

/**
 * @author 
 * @version 1.0
 * @ClassName MessageType
 * @Description TODO 类描述
 * @date 2024/1/5  10:35 上午
 **/
public interface MessageType {

    //消息类型
    //1、在消息类型中定义一些常量
    //2、不同的常量值代表不同的消息类型
    String MESSAGE_LOG_SUCCESS = "1";//表示登陆成功
    String MESSAGE_LOG_FAIL = "2";//表示登陆失败
    String MESSAGE_COMM_MS="3";//普通消息
    String MESSAGE_GET_ONLINE_FIRED="4";//要求返回在线用户列表
    String MESSAGE_RET_ONLINE_FIRED="5";//返回在线用户列表
    String MESSAGE_CLIENT_EXIT="6";//客户端请求退出
}

1、cn.com.agree.qqserver.service.ServerConnectClient

    public void run() {
        while (true) {
            try {
                log.debug("服务端和客户端" + userId + "正在通信通信,读取数据...");
                // 设置Socket的超时时间为5000毫秒(5秒)
//                socket.setSoTimeout(5000);
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                //TODO 后续处理从客户端获取的消息
                log.debug("message:{}", message);
                log.debug(userId+"要在用户列表");
                switch (message.getMsgType()) {
                    case MessageType.MESSAGE_GET_ONLINE_FIRED:
                        String users = ManageServerConnectClient.getOnlineUsers();
                        Message message2 = new Message();
                        message2.setContent(users);
                        message2.setSender(message.getGetter());
                        message2.setMsgType(MessageType.MESSAGE_RET_ONLINE_FIRED);
                        oos.writeObject(message2);
                        break;
                    default:
                        log.debug("其他类型暂不处理");
                        break;
                }


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

2、cn.com.agree.qqserver.service.ManageServerConnectClient

package cn.com.agree.qqserver.service;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @author 
 * @version 1.0
 * @ClassName ManageServerConnectClient
 * @Description TODO 类描述
 * @date 2024/1/5  5:50 下午
 **/
public class ManageServerConnectClient {
    private static Map<String, ServerConnectClient> hm = new HashMap();

    public static void addServerConnectClient(String userId, ServerConnectClient serverConnectClient) {
        hm.put(userId, serverConnectClient);
    }

    public static ServerConnectClient getServerConnectClient(String userId) {
        return hm.get(userId);
    }

    public static String getOnlineUsers() {
        String users = "";
        Iterator<String> iterator = hm.keySet().iterator();
        while (iterator.hasNext()) {
            users += iterator.next();
            users+=" ";
        }
        return users;
    }
}

运行效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文章来源:https://blog.csdn.net/adzn1/article/details/135486760
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。