功能和特性

  • 基于socket实现的c/s架构的的通信
  • 服务器和客户心跳连接
  • gson实现的消息通信机制
  • 注册及登录
  • 支持私聊和群聊。
  • 动态更新用户列表以及用户消息提示
  • 支持emoji表情,以及emoji表情选择器
  • 服务器端数据库用户记录
  • 实现文件传输
  • 文件记录

功能展示

  • login

  • chatroom





  • 表情包

  • 数据库

整体架构

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

    • 由masterserve进行事件的分发
    • 由workserver具体的管理单个用户的消息请求
    • 相关模型链接 Master-Worker模式
  • 消息机制

    • 采用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<String>() {
@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,显示的表情以表情简写表示

项目地址We Chat

javafx 聊天室WeChat的更多相关文章

  1. nodejs与websocket模拟简单的聊天室

    nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...

  2. Java进阶:基于TCP通信的网络实时聊天室

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  3. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  4. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  5. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

  6. 用SignalR 2.0开发客服系统[系列2:实现聊天室]

    前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...

  7. 基于NodeJS的秘室聊天室

    借着放假期间将NodeJS重新回顾了一下并玩了一下sketch来进行设计界面,很不错.(注:代码整理后会放到github上,请关注.) 本次聊天室我给它定义了一个名称叫“秘密聊天室”. 需求: 技术选 ...

  8. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...

  9. 基于React,Redux以及wilddog的聊天室简单实现

    本文主要是使用ReactJs和Redux来实现一个聊天功能的页面,页面极其简单.使用React时间不长,还是个noob,有不对之处欢迎大家吐槽指正. 还要指出这里没有使用到websocket等技术来实 ...

随机推荐

  1. UVa11882,Biggest Number

    搜索+剪枝 如此水的一个题,居然搞了一上午 出错在bfs与dfs时共用了一个vis数组,导致bfs完后返回dfs应该能访问到的点访问不到 自己想怎么剪枝,想了几个剪枝方法,又证明,又推翻,再想,再证明 ...

  2. sphinx安装

    相关命令及步骤    创建主索引:        /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all  ...

  3. 读取本地的json文件

    最近写项目需要读取本地的json文件,然后悲催的发现前端新手的我居然不会,查查找找发现这东西并不难,但是应该是比较常用的,毕竟json太好用了! 我是直接用的jquery实现的,但是Ajax也可以,不 ...

  4. Kotlin——最详解的类(class)的使用

    在任何一门面向对象编程的语言里,类(class)是非常基础.但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类.Kotlin也是如此,下面详细为大家介绍Kotlin中的类的 ...

  5. ASP.NET Core中的OWASP Top 10 十大风险-SQL注入

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  6. 深度揭秘ES6代理Proxy

    最近在博客上看到关于ES6代理的文章都是一些关于如何使用Proxy的例子,很少有说明Proxy原理的文章,要知道只有真正掌握了一项技术的原理,才能够写出精妙绝伦的代码,所以我觉得有必要写一篇关于深刻揭 ...

  7. 入我新美大的Java后台开发面试题总结

    静儿最近在总结一些面试题,那是因为做什么事情都要认真.面试也一样,静儿作为新美大金融部门的面试官,负责任的告诉大家,下面的问题回答不上来,面试是过不了的.不过以下绝不是原题,你会发现自己实力不过硬,最 ...

  8. CentOS恢复root口令方法

    CentOS6和CentOS7恢复root口令的方法有很大不同 CentOS6: 在引导菜单倒计时界面按任意键,进入grub引导菜单 按e键进入内核引导参数编辑界面 选中kernel项,按e键编辑引导 ...

  9. 机器学习数学|微积分梯度jensen不等式

    机器学习中的数学 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原创文章,如需转载请保留出处 本博客为七月在线邹博老师机器学习数学课程学习笔记 索引 微积分,梯度和Jensen不等式 Tay ...

  10. python20171113笔记

    问题一: python {File "<stdin>", line 1} error 解决方法:就是不用先输入 python进入python解释器,而直接输入pytho ...