功能和特性

基于socket实现的c/s架构的的通信

服务器和客户心跳连接

gson实现的消息通信机制

注册及登录

支持私聊和群聊。

动态更新用户列表以及用户消息提示

支持emoji表情,以及emoji表情选择器

服务器端数据库用户记录

实现文件传输

文件记录

功能展示

login

chatroom

表情包

数据库

整体架构

使用了比较简单的worker-master架构。

由masterserve进行事件的分发

由workserver具体的管理单个用户的消息请求

消息机制

采用json作为通信载体,后期功能性的更改较为简单

通信命令字设计如下

public final static boolean SINGLE = true;

public final static boolean GROUP = false;

/**

* status

*/

public final static int SUCCESS = 0x01;

public final static int FAILED = 0x02;

/**

* message

*/

public static Integer COMMAND = 0x10;

public static Integer TIME = 0x11;

public static Integer USERNAME = 0x12;

public static Integer PASSWORD = 0x13;

public static Integer SPEAKER = 0x14;

public static Integer RECEIVER = 0x15;

public static Integer CONTENT= 0x16;

/**

* command

*/

public final static int COM_LOGIN = 0x20;

public final static int COM_SIGNUP = 0x21;

public final static int COM_RESULT = 0x22;

public final static int COM_DESCRIPTION = 0x23;

public final static int COM_LOGOUT =0x24;

public final static int COM_CHATWITH = 0x25;

public final static int COM_GROUP = 0x26;

public final static int COM_CHATALL = 0x27;

public final static int COM_KEEP = 0x28;

public final static int COM_MESSAGEALL = 0X29;

基本响应流程概述

Client->Server

请求注册(已注册用户请求登录),请求登录状态

聊天命令分为单人和多人群聊

Server->Client

返回登录|注册成功反馈

返回登录|注册失败反馈,及失败原因(用户已经注册|用户尚未注册|密码错误|服务器连接失败等...)

每个用户登录广播用户集

提取数据仓发送消息给指定用户

广播信息

心跳连接

之前考虑上线下线方式的时候想到的一个办法是,下线的时候给服务器发送下线通知,后面考虑了出现断网等突发情况时这样的设计将出现问题。所以采用了心跳连接的方式。

server端采用了以时间差为判断方式的连接判断方式,通过具体的实践server端的实践差为2000ms较为合适.

client维持了500ms的心跳

Server

启动环节

服务器前先查询数据库,从中加载出用户列表到内存。

(注:这样的方式在数据较大时不合适,应该设计好数据库的消息存储机制,避免服务器端的数据量大时出现问题,这个小程序因为之前在设计的时候本来没有加上数据库的打算,后期加入后,也不想再次重构服务器端)

数据库已经封装成Dao层,使用双重锁的单例模式进行控制访问

用户信息存储及转发

用户信息存储仓的设置

serverUser的实体bean在设计时采用的是 ConcurrentLinkedQueue作为信息存储仓的数据结构,保证在多线程下的安全。

每次server端读取client端发送的comment将数据发送到对应user的warehouse(数据仓)中,接着读取其控制用户的warehouse,执行命令。

client

整体基本架构为MVC

model层通过control进行数据交互同时control层进行login和chatroom界面切换控制。

基本界面切换

之前对javafx不熟悉,根据写andorid经验,总觉得Javafx的界面切换不是很方便。初期将界面写了出来,后期进行了界面切换方式的修改。

参考JavaFX - 实现管理多个Stage窗口及源码解析

一些值得注意的问题

gson的使用

gson 的好用不必多说,写的时候发现一个小问题gson 在使用时会将Integer以及int都会转为Double或者double类型

解决方案如下解决gson将Integer默认转换成Double的问题

javafx UI界面更新

类似于android在UI界面只能在UI线程中进行更改,在javafx中也是如此。不过之前Android知道其异步方式的实现

在javafx中查阅资料后总结下其更改界面的方法

Platform.runLater(new Task() {

@Override

protected String call() throws Exception {

//do UI operato

return null;

}

});

文件路径

在写图片的显示时发现了显示的问题,特地的查了这部分的材料,其中比较好的几篇

Java中文件的相对路径与绝对路径

Java中文件路径及其访问

emoji表情的实现

方案1 传统emoji的表情的实现

其实早在2010年,Unicode编码就已经纳入了700多个Emoji表情,所以是可以支持表情的,只要加载支持Emoji表情的字库即可 链接How to support Emojis (Part1)

但是emoji的显示时要依赖于平台的,之前在Android端写过的emoji实现由于和ios端不统一也重新定制了一份

附上对比

Android

javafx

简直要丑哭了

实现方式

emoji 的编码方式

java中String 采用 UTF-16 编码方式存储所有字符, getBytes(String charsetName)也就是转为UTF-8 即可实现编码转换。将其输出即可显示emoji

方案2 之前在Android端通过对SpannableString 的处理实现添加任何的图片到文本中

根据这个思路 参考EmojiOneJava实现了功能.

而且javafx的textArea不支持 文字加图片, 在java分fx中textflow可以存放子组件,所以显示界面使用textflow,输入界面使用textArea,显示的表情以表情简写表示

java实现聊天室界面javafx_java 聊天室WeChat相关推荐

  1. Java实现--基于服务器的多用户聊天室

    多用户聊天室 1.项目简介 2.开发环境 3.项目具体功能 4.运行结果 5.其他功能实现运行结果 6.具体实现代码 登录页面: 客户端: 服务器端: 1.项目简介 基于服务器的多用户聊天室应用软件. ...

  2. java聊天室代码_java聊天室的实现代码

    本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下 聊天室界面: 源码: public class ClientFrame extends Frame { private Te ...

  3. Java websocket + redis 实现多人单聊天室,多人多聊天室, 一对一聊天

    多人,单聊天室版 FEATURE 多人聊天, 界面简洁美观, 使用ueditor支持发送文字,图片信息 群聊成员列表, 登入登出公告 存储聊天记录, 查看历史消息 技术点 使用CopyOnWriteM ...

  4. unity制作聊天室界面

    本文利用unity UGUI制作聊天室界面,按回车发送消息,带滚轮,可以查看之前的消息. PS:本文不带通信功能,仅为界面制作.需要带socket通信功能的unity聊天室模板请评论留言. 先上效果图 ...

  5. Java Socket实现简易多人聊天室传输聊天内容或文件

    Java Socket实现简易多人聊天室传输聊天内容或文件 Java小练手项目:用Java Socket实现多人聊天室,聊天室功能包括传输聊天内容或者文件.相比于其它的聊天室,增加了传输文件的功能供参 ...

  6. java多线程聊天室_【Java】Socket+多线程实现控制台聊天室

    另:具体代码实现已移植github: https://github.com/ygj0930/Chat-Room-in-Java  ,大家fork之余记得给我个star呀~ 聊天室程序的结构图: 架构解 ...

  7. java仿qq聊天系统 多人聊天室

    目录 项目介绍 项目截图 服务器与客户端 新用户注册 注册新账号成功 进入聊天室 多人在线 选择发送文件 文件接收提醒 项目代码参考 服务器入口程序 服务器请求处理 原理解析 服务器多人网络连接: 如 ...

  8. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

  9. 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具。QQ_Chat

    代码下载地址 原博客地址 QQ_Chat 基于TCP,Socket编程,模仿腾讯QQ界面,使用Java开发的一款网络聊天工具. (内含报告) 工具: Eclipse.Navicat for MySQL ...

最新文章

  1. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)
  2. 关于matlab向文件写入数据的方法——留着备用
  3. poj 1469 二分图最大匹配
  4. android 设置PopupWindow的显示大小
  5. 前端Chrome调试技巧汇总
  6. vue监控指定div滑动触底
  7. 第 4 章 terminal
  8. ssm+教务信息管理 毕业设计-附源码161124
  9. Arduino Uno - 控制4位8段共阴极数码管 显示数字
  10. 小马过河(计算几何)
  11. 股权融资的A、B、C、D轮
  12. 蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践读后感
  13. VOC2007数据集制作
  14. Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程
  15. 计算机语言学国外排名,美国语言学专业排名
  16. iOS开发中一些有用的小代码
  17. ubuntu训练深度学习模型电脑重启解决方法
  18. IAST 在去哪儿 Q-SDL 体系中的应用
  19. Python基础——垃圾回收、格式化输入输出、基本运算符、流程控制
  20. Ryan dahl对node.js初衷

热门文章

  1. 第三次学JAVA再学不好就吃翔(part48)--String类的判断功能
  2. python观察日志(part6)--不可变的元祖
  3. 10张逻辑思维图,迅速提升你的工作能力
  4. 为jupyter_notebook增加目录
  5. 如何给基于 SAP Cloud SDK 的应用增添缓存支持 Cache support
  6. css里的positioning scheme, 即position property
  7. NgRx使用CreateSelector组装复合Selector
  8. 一个css文件里实际并不存在的class,不能给element layout产生任何影响
  9. HiveMQ web client客户端运行出错的错误分析
  10. SAP CRM WebClient UI和Hybris Commerce的懒加载机制