• Java课程设计


    一、团队信息

    任务分配:
    前期调查与项目设计、服务端代码编写、客户端多线程修改 个人博客
    GUI设计及代码编写 个人博客
    客户端代码编写

    二、本项目的git地址

    简易聊天室

    三、项目git提交记录截图

    四、前期调查

    类似经常在用的QQ微信,我们只实现简单的聊天功能。

    五、主要功能流程图

    六、面向对象设计包图、类图

    服务端:


    客户端:


    服务端与客户端共用:

    七、项目运行截图

    登录:

    注册:

    聊天界面:

    接收与发送消息:

    八、项目关键代码分模块描述

    手动创建线程池

    //获取CPU核心数
    final int coreSize = Runtime.getRuntime().availableProcessors();
    //手动创建线程池
    ThreadFactory threadFactory = new ThreadFactoryBuilder()
            .setNameFormat("pool-%d").build();
    ExecutorService threadPool = new ThreadPoolExecutor(
            coreSize * 3, 200, 0L,
            TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(1024),
            threadFactory,
            new ThreadPoolExecutor.AbortPolicy()
    );
    

    从数据库获取未读消息,并标记为已读

    if (connection != null) {
        try {
            preparedStatement = connection.prepareStatement(sqlQuery);
            preparedStatement.setString(1, currentUserName);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                //取出相关数据
                String sender = resultSet.getString(2);
                String receiver = resultSet.getString(3);
                String text = resultSet.getString(5);
                Timestamp time = resultSet.getTimestamp(4);
                //放入数组
                messageList.add(new TextMessage(sender, receiver, text, time));
            }
            //将未读消息标记为已读
            preparedStatement = connection.prepareStatement(sqlUpdate);
            preparedStatement.setString(1, currentUserName);
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtil.releaseAll(resultSet, preparedStatement, connection);
        }
    }
    

    客户端接收未读消息

    try {
          ClientController.requestUnreadTextMessage();
          object = objectInputStream.readObject();
          if (object instanceof ArrayList) {
              //获取未读文本消息
              //强制类型转化ArrayList
              if (((ArrayList<?>) object).get(0) instanceof TextMessage) {
                  List<TextMessage> textMessageList = new ArrayList<>();
                  for (Object o : (ArrayList<?>) object) {
                      textMessageList.add((TextMessage) o);
                  }
                  if (textMessageList.size() > 1) {
                      ChatStage.setTextMessageList(textMessageList);
                  }
              }
          }
      } catch (IOException | ClassNotFoundException e) {
          e.printStackTrace();
      }
    

    点击用户按钮事件

    userButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            currentUser = user.getUserName();
            if(chatViewMap.containsKey(user.getUserName())){
                chatNode[0] = chatViewMap.get(user.getUserName());
            }else{
                chatNode[0] = new VBox();
                chatNode[0].setSpacing(20);
                ChatStage.getChatViewMap().put(currentUser,chatNode[0]);
            }
            if(chatNode[0] !=null){
                stackPane1.getChildren().clear();
                stackPane1.getChildren().add(chatNode[0]);
            }
        }
    });
    

    九、项目代码扫描结果及改正


    除了“单个方法总行数不超过80行”外,其他均已解决。

    十、项目总结(包括不足与展望、想要进一步完成的任务)

    不足:消息发出后接收延迟、GUI不能实时显示消息,必须点一下用户框才可以接收实时消息等等。
    想要进一步完成的任务:文件传输和多人聊天室。

  • 相关阅读:
    那些离不开的 Chrome 扩展插件
    Spring Boot 实战 —— 入门
    Maven 学习笔记
    Linux lvm 分区知识笔记
    Linux 双向 SSH 免密登录
    CentOS Yum 源搭建
    Ubuntu 系统学习
    iOS 测试三方 KIF 的那些事
    Swift 网络请求数据与解析
    iOS Plist 文件的 增 删 改
  • 原文地址:https://www.cnblogs.com/wzt392217419/p/14342005.html
Copyright © 2020-2023  润新知