zoukankan      html  css  js  c++  java
  • 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不能实时显示消息,必须点一下用户框才可以接收实时消息等等。
    想要进一步完成的任务:文件传输和多人聊天室。

  • 相关阅读:
    JavaScript Hoisting
    关于性能工具
    JavaScript 新旧替换五:函数嵌套
    JavaScript 新旧替换四:继承
    JavaScript 新旧替换三:参数转换
    JavaScript 新旧替换二:赋值和取值
    test
    这么多数组方法,你掌握了么?
    问问自己,你真的会用防抖和节流么????
    防抖、节流、闭包的真谛所在
  • 原文地址:https://www.cnblogs.com/wzt392217419/p/14342005.html
Copyright © 2011-2022 走看看