项目实战系列一:【多用户及时通信系统】


在这里插入图片描述

1. QQ用户登录

在这里插入图片描述

1.1 用户登录1

  • qqcommon包下
    User类序列化
    在这里插入图片描述
    Message消息类序列化
    在这里插入图片描述
    MessType接口
    在这里插入图片描述
  • qqclient.utils包下
    Utility.java工具类
  • qqclient.view包下
public class QQView {
    private User u = new User();
    private String key = "";//接受用户键盘输入
    private boolean loop = true;//控制循环

    public static void main(String[] args) {
        new QQView().mainMenu();
        System.out.println("客户端退出");
    }

    public void mainMenu() {
        while (loop) {
            System.out.println("==============欢迎登陆网络通信系统==============");
            System.out.println("\t\t1 登录系统");
            System.out.println("\t\t9 退出系统");
            System.out.print("请输入你的选择: ");
            key = Utility.readString(1);
            switch (key) {
                case "1":
                    System.out.print("请输入你的用户名: ");
                    String userId = Utility.readString(50);
                    System.out.print("请输入你的密码: ");
                    String password = Utility.readString(50);
                    //设计一个类,验证用户名密码
                    if (false) {
                        System.out.println("==============欢迎(用户 " + userId + " 登录成功)==============");
                        //进入二级菜单
                        while (loop) {
                            System.out.println("\n==============网络通信系统二级菜单(用户 " + userId + " )==============");
                            System.out.println("\t\t1 显示在线用户列表");
                            System.out.println("\t\t2 群发消息");
                            System.out.println("\t\t3 私聊消息");
                            System.out.println("\t\t4 发送文件");
                            System.out.println("\t\t9 退出系统");
                            System.out.print("请输入你的选择: ");
                            key = Utility.readString(1);
                            switch (key) {
                                case "1":
                                    System.out.println("显示在线用户列表");
                                    break;
                                case "2":
                                    System.out.println("群发消息");
                                    break;
                                case "3":
                                    System.out.println("私聊消息");
                                    break;
                                case "4":
                                    System.out.println("发送文件");
                                    break;
                                case "9":
                                    System.out.println("退出系统");
                                    loop = false;
                                    break;
                            }
                        }
                    } else {
                        System.out.println("登录失败");
                    }
                    break;
                case "9":
                    System.out.println("退出系统");
                    loop = false;
                    break;
            }
        }
    }
}

1.2 用户登录2

客户端UserClientServer类
该类用于完成用户登录验证和用户注册等功能;

public class UserClientServer {

    private User u = new User();
    private Socket socket;

    public boolean checkUser(String userId, String password) {
        //创建一个user对象
        u.setUserId(userId);
        u.setPassword(password);
        boolean b = false;

        try {
            //连接到服务端
            socket = new Socket(InetAddress.getLocalHost(), 9999);
            //获取socket关联的对象输出流
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(u);

            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message message = (Message) ois.readObject();
            if (message.getMessType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {
                //启动线程,维护socket
                ClientConnectServerThread clientConnectServerThread = new ClientConnectServerThread(socket);
                clientConnectServerThread.start();
                //集合,管理线程
                ManageClientConnectServerThread.addClientConnectServerThread(userId, clientConnectServerThread);
                b = true;
            } else {
                //如果连接失败,关闭已开启的socket
                socket.close();
                System.out.println();
            }

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

客户端线程类

public class ClientConnectServerThread extends Thread {
    //socket属性
    private Socket socket;
    //构造器socket赋值
    public ClientConnectServerThread(Socket socket) {
        this.socket = socket;
    }
    //得到socket
    public Socket getSocket() {
        return socket;
    }

    @Override
    public void run() {
        while (true) {

            try {
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();
                //做其它的处理

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

客户端管理线程的类
在这里插入图片描述

1.3 用户登录3

  • qqserver.server包下
    服务端,QQServer类
public class QQServer {
    private ServerSocket ss = null;
    public QQServer() {
        //端口可以写在配置文件
        try {
            System.out.println("服务端在9999端口监听");
            ss = new ServerSocket(9999);
            while (true) {
                Socket socket = ss.accept();
                //读取User对象
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                //输出Message对象
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                User u = (User) ois.readObject();
                Message message = new Message();
                if ("100".equals(u.getUserId()) && "123456".equals(u.getPassword())) {
                    message.setMessType(MessageType.MESSAGE_LOGIN_SUCCEED);
                    oos.writeObject(message);
                    //登陆成功后,创建线程和客户端保持通信
                    ServerConnectClientThread serverConnectClientThread = new ServerConnectClientThread(socket, u.getUserId());
                    serverConnectClientThread.start();
                    //把该线程对象放入集合中管理
                    ManageClientThreads.addClientThread(u.getUserId(), serverConnectClientThread);
                } else {//登录失败
                    message.setMessType(MessageType.MESSAGE_LOGIN_FAIL);
                    oos.writeObject(message);
                    socket.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端线程类
在这里插入图片描述
ManageClientThreads管理线程类
在这里插入图片描述

  • qqframe包下
    QQFrame类中启动程序

让多个用户登陆服务端,不再是"100","123456"这一个用户
在这里插入图片描述
紧接着专门写一个方法验证用户名和密码
在这里插入图片描述
单点登录
在这里插入图片描述
在这里插入图片描述

2. 拉取在线用户

补充MessageType
在这里插入图片描述
在客户端UserClientServer类中定义请求在线用户列表方法,并对服务端发出请求
在这里插入图片描述
在这里插入图片描述
在客户端的线程类中等待服务端发送数据
在这里插入图片描述
服务端代码
获取在线用户列表,即要遍历ManageClientThreads类中的hm集合,将这段遍历集合的代码封装进ManageClientThreads类中的getOnlineUser()方法
在这里插入图片描述
在服务端的线程类中接收请求用户列表的消息请求,调用getOnlineUser()方法得到在线用户列表,通过socket将数据返回给客户端
在这里插入图片描述

3. 无异常退出

在这里插入图片描述
在UserClientServer类中编写一个方法,客户端退出系统,并给服务器发送一个退出系统的message
在这里插入图片描述
在服务端响应客户端的请求,接收客户端发送的message,进行处理
在这里插入图片描述

4. 私聊系统

在这里插入图片描述

  • 客户端server包下新建MessageClientServer类
    该类用于提供和消息相关的服务方法
    在MessageClientServer类中编写一个方法并调用
    在这里插入图片描述
    在这里插入图片描述

在服务端的通信线程中接收这个message并进行转发
在这里插入图片描述
在客户端把从服务端转发过来的消息显示
在这里插入图片描述

5. 群聊

在客户端MessageClientServer类中编写一个方法,并调用;向服务端发送一个请求
在这里插入图片描述
在这里插入图片描述
在服务端的通信线程中接收这个message并进行转发(群发)
在这里插入图片描述
在客户端把从服务端转发过来的消息显示
在这里插入图片描述

3. 发送文件

在这里插入图片描述
补充MessageType
在这里插入图片描述
Message类扩充
在这里插入图片描述

  • server包下新建FileClientServer类
    该类/对象 完成文件传输服务
public class FileClientServer {
    /**
     * @param src 源文件
     * @param dest 把该文件传输到对方的哪个目录
     * @param sender 发送用户id
     * @param getter 接受用户id
     */
    public void sendFileToOne(String src, String dest, String sender, String getter) {
        //读取src文件 封装到message对象
        Message message = new Message();
        message.setMessType(MessageType.MESSAGE_FILE_MES);
        message.setSender(sender);
        message.setGetter(getter);
        message.setSrcPath(src);
        message.setDestPath(dest);
        //需要将文件读取
        BufferedInputStream bis = null;
        byte[] fileBytes = new byte[(int) new File(src).length()];//获取文件的大小(Long 字节)

        try {
            bis = new BufferedInputStream(new FileInputStream(src));
            bis.read(fileBytes);
            //将文件对应的字节数组设置到message对象
            message.setFileBytes(fileBytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //提示信息
        System.out.println("\n" + sender + "给 " + getter + " 发送文件:" +
                src + " 到对方的电脑目录" + dest);

        try {
            //发送
            ClientConnectServerThread clientConnectServerThread
                    = ManageClientConnectServerThread.getClientConnectServerThread(sender);
            Socket socket = clientConnectServerThread.getSocket();
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端接收这个消息并转发
在这里插入图片描述
客户端接收到转发消息,输出到控制台
在这里插入图片描述
客户端调用
在这里插入图片描述

3.1 服务端推送新闻

  • qqserver包下新建SendNewsToAllServer类
public class SendNewsToAllServer implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.print("请输入服务器要推送的新闻[exit退出推送新闻的线程]: ");
            String news = Utility.readString(1000);
            //构建一个消息
            Message message = new Message();
            message.setSender("服务器");
            message.setContent(news);
            message.setMessType(MessageType.MESSAGE_TO_ALL_MES);
            message.setSendTime(new Date().toString());
            System.out.println("服务器推送消息给所有人 说: " + news);

            //遍历当前所有的通信线程,得到Socket,并发送message
            Map<String, ServerConnectClientThread> hm = ManageClientThreads.getHm();

            Collection<ServerConnectClientThread> serverConnectClientThreads
                    = hm.values();
            Iterator<ServerConnectClientThread> iterator =
                    serverConnectClientThreads.iterator();
            while (iterator.hasNext()) {
                ServerConnectClientThread serverConnectClientThread = iterator.next();
                Socket socket = serverConnectClientThread.getSocket();
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在QQServer类启动线程
在这里插入图片描述

3.2 离线留言和离线发文件

  1. 在ManageOffLIneUserMessage类中把添加离线消息这一功能进行封装
    在这里插入图片描述
    群聊消息
    当用户向所有的用户发送群聊消息的时候,给离线状态的用户设置留言
    在这里插入图片描述
    私聊消息
    当用户向某一离线用户发送私聊消息的时候,给这个离线用户设置留言
    在这里插入图片描述
    离线文件
    当用户向某一离线用户发送文件的时候,将文件暂存在服务端中,当用户上线时,得到message
    在这里插入图片描述
  2. 当离线用户登录的时候,登录成功后,服务器统一将离线消息(群聊和私聊)和离线文件发送给用户,将这一功能封装进ManageOffLIneUserMessage类
    在这里插入图片描述
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这是一篇关于大型电商用户行为分析大数据平台的实战文章。文章介绍了如何使用Spark技术构建一个可扩展的、高性能的大数据平台,用于分析电商用户的行为数据。该平台可以处理海量的数据,提供实时的数据分析和可视化展示,帮助电商企业更好地了解用户行为,优化产品和服务,提升用户体验和销售业绩。文章详细介绍了平台的架构设计、数据处理流程、数据分析方法和可视化展示方式,对于从事大数据分析和电商业务的人员具有很高的参考价值。 ### 回答2: 大数据平台在如今的电商领域中扮演着越来越重要的角色,帮助电商企业更好地了解用户需求、优化营销策略、提高销售效率和用户体验。而在这个领域中,Spark大数据分析引擎的应用也愈发广泛,帮助企业更好地处理和分析海量的数据。 电商用户行为分析大数据平台的构建需要考虑多个因素,包括数据采集、数据存储和数据处理等方面。其中,数据采集是关键的一环,需要收集用户在电商平台中的各种行为数据,如浏览商品、下单、付款和退款等。这些数据需要经过初步处理和清洗后才能被存储到大数据平台中。 在数据存储方面,Hadoop和HBase是两个常用的大数据存储技术。Hadoop可以将各种不同类型的数据按照文件的形式存储,而HBase则是分布式的、面向列的数据库,可以更好地支持结构化数据的存储和查询。 在数据处理方面,Spark作为一种快速而通用的大数据处理引擎,具有良好的扩展性、高效性和易用性。Spark可以处理非常大的数据集,并且可以在内存中缓存数据以加速处理速度。此外,Spark还提供了一些高级API,如Spark SQL、MLlib和GraphX等,可以帮助企业更高效地进行数据分析和挖掘。 在电商用户行为分析大数据平台的具体使用场景中,Spark可以用于用户行为分析、推荐算法优化、用户画像构建和活动效果评估等方面。例如,可以使用Spark对用户浏览、下单和购买等行为数据进行分析,探索用户行为模式,挖掘用户需求,优化商品推荐和定价策略;同时,可以使用Spark对不同用户群体的行为数据进行整合和分析,为企业提供更准确的用户画像信息,帮助企业更好地了解不同用户群体的特点和需求。通过这些分析,企业可以精准地掌握用户需求,提高产品服务质量和营销效果,加速企业的发展和壮大。 ### 回答3: 随着电商市场的不断发展,对于用户的行为分析越来越重要,为了更好地提升用户体验和销售业绩,企业需要构建一个可靠的电商用户行为分析大数据平台。而Spark大型项目实战:电商用户行为分析大数据平台(一)则是这一领域的先锋。 Spark大型项目实战:电商用户行为分析大数据平台(一)所涉及到的核心技术主要有三个方面:数据采集、数据处理及数据分析。 首先是数据采集。在电商平台上,用户的行为主要包括页面访问、商品浏览、购物车添加、下单付款等。为了获取这些数据,需要在网站内添加代码或者使用第三方网站统计工具进行数据采集。 其次是数据处理。这一步骤主要利用Spark进行离线数据处理和流式数据处理,包括数据清洗、数据整合、数据融合、数据统计等。对于数据清洗来说,首先需要对数据进行去重、过滤,然后再进行数据整合、数据融合。数据统计则是非常重要的一步,可以统计用户的浏览、下单、付款等行为,以此来评估用户的消费行为和进行推荐。在流式数据处理方面,可以使用Kafka和Spark Streaming对实时数据进行处理,以提升数据处理效率和精确度。 最后是数据分析。通过对采集和处理的数据进行分析,可以对用户消费行为、支付渠道、商品销售情况等进行全面评估和推广分析。可以通过编写Spark程序,使用SQL和Python进行数据分析,从而挖掘出数据中隐藏的价值。例如可以通过用户行为数据来推荐商品、针对用户定制促销策略等。 以上就是Spark大型项目实战:电商用户行为分析大数据平台(一)的主要内容。通过使用Spark等技术,企业可以深入了解用户的消费行为,优化促销策略和提高销售业绩,提升用户满意度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~ 小团子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值