一、团队信息
任务分配:
前期调查与项目设计、服务端代码编写、客户端多线程修改 个人博客
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不能实时显示消息,必须点一下用户框才可以接收实时消息等等。
想要进一步完成的任务:文件传输和多人聊天室。