一、团队信息

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

二、本项目的git地址

简易聊天室

三、项目git提交记录截图

Java课程设计 - 在线聊天室(团队)

四、前期调查

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

五、主要功能流程图

Java课程设计 - 在线聊天室(团队)

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

服务端:
Java课程设计 - 在线聊天室(团队)
Java课程设计 - 在线聊天室(团队)
客户端:
Java课程设计 - 在线聊天室(团队)
Java课程设计 - 在线聊天室(团队)
服务端与客户端共用:
Java课程设计 - 在线聊天室(团队)

七、项目运行截图

登录:
Java课程设计 - 在线聊天室(团队)
注册:
Java课程设计 - 在线聊天室(团队)
聊天界面:
Java课程设计 - 在线聊天室(团队)
接收与发送消息:
Java课程设计 - 在线聊天室(团队)

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

手动创建线程池

//获取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]);
        }
    }
});

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

Java课程设计 - 在线聊天室(团队)
除了“单个方法总行数不超过80行”外,其他均已解决。

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

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

相关文章:

  • 2021-04-07
  • 2022-12-23
  • 2022-12-23
  • 2021-06-15
  • 2021-06-15
  • 2021-11-30
  • 2022-01-27
  • 2021-05-22
猜你喜欢
  • 2021-10-02
  • 2021-09-22
  • 2021-12-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-12
相关资源
相似解决方案