基于Java的在线聊天室
概述
详细
一、项目功能
本项目使用java socket编程,实现一个具有GUI界面的在线聊天室:

该项目具有以下几项功能:
构建一个服务器 S 和若干个客户机 C;
每一台客户机 C 都可以与服务器 S 和其他客户机连接;
每一台客户机 C 都可以通过 S 获得其他客户机发来的信息,并显示哪一台客户机在线,使用的是什么 IP 等;
群聊功能:每一台客户机 C 可以通过服务器 S 的群聊天室与其他客户机通信,即既可接收信息也可发送信息;
私聊功能:客户机 C 通过选择在线的用户并进行连接,进行私聊;
支持文件传输
二、项目文件结构
项目机构图如下:

客户端和服务器分离,其中beautyeye_lnf.jar是GUI用到的第三方库,compile.sh是编译的脚本,里面的内容是编译的命令,如下图
rm -f *.class client/*.class server/*.class
cd server
javac *.java
cd ../client
javac *.java -classpath .:beautyeye_lnf.jar
cd ..
javac *.java
需要注意的是编译客户端的java文件时classpath为 .:beautyeye_lnf.jar ,编译之后先运行服务器,端口号可换为其他端口
java ServerMain 8080
然后运行客户端,可同时运行多个客户端,在客户端的GUI界面,填写服务器IP和端口以及用户姓名即可连接。
java -classpath .:client/beautyeye_lnf.jar ClientMain
三、实验设计
1. 服务器设计思路
一共有两台服务器,一台聊天服务器 ChatServer 和一台文件服务器 FileServer。
ChatServer
ChatServer 主要负责转发聊天内容和用户信息给所有用户,用于支持跟进用户信息功能和群聊功能。用户 A 连接服务器的时候,首先向服务器发送一个用户名,服务器收到之后搭建 socket 连接,然后记录用户 A 的 IP 和端口号,接着服务器将所有当前在线的用户的名字、IP 和端口信息发送给这位刚上线的用户 A,最后服务器向其他在线的用户群发用户 A 的名字、IP 和端口号以提示新用户上线,这里IP 和端口号的作用是方便客户端进行私聊。用户 A 要下线的时候,发送一个命令"[OFFLINE]"给服务器提示下线,服务器清除相关资源并关闭连接,同时将用户 A 要下线的消息转发给其他在线用户。在使用群聊功能时,某个客户端发起群聊消息给服务器,服务器会把该消息转发给其他在线用户,从而实现群聊的功能。私聊时,客户端向服务器发送私聊消息,由服务器转发给指定的接收用户。
下面是服务器与客户端的交互的过程以及发送数据的格式:

FileServer
FileServer 主要为整个应用提供传输文件服务器,包括群发文件和私发文件。客户端想要发送文件的时候,将文件发送给服务器并附加相关信息(群发/私发), 服务器根据客户端的需求将文件转发给其他在线⽤户。下面是文件服务器和客户端的交互过程:


2. 客户端设计思路
群聊和私聊
与服务器交互,直接按照前面所述的格式向服务器发送数据,并且接受来自服务器的数据即可。发送数据时,将相关的数据按照相应的格式封装好再进行发送, 接收数据时,将来自服务器的数据按照"[#]"进行切割,提取相关字段的数据之后呈递给 GUI 层使用。
文件传输
客户端不管是私聊还是群聊的文件都直接发送给服务器,再由服务器完成相应的转发。通信过程在前面已经有所阐述,这里不再重复。
与 GUI 层的交互
客户端和 GUI 分别是两个线程,GUI 负责用户界面的渲染和相关操作的响应,客户端则是负责跟服务器进行数据交互或者私聊的时候跟其他客户端进行交互,并且将交互的数据呈递给 GUI 使用。下面简单描述 GUI 与服务器的交互过程。

四、其他说明
第一次发布,有疑问的可以评论或联系我
另外,说明一点:
本项目代码不是直接的eclipse项目形式,不能直接导入eclipse运行,放入到eclipse运行,需要自己建java项目。
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
基于Java的在线聊天室的更多相关文章
- .NET Core 基于Websocket的在线聊天室
什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...
- [置顶]
Chat Room:基于JAVA Socket的聊天室设计
d0304 更新功能实现 d0312 更新部分图片&UI设计部分 d0318 更新功能实现 d1222 实现添加好友功能.实现注册功能.修改大量BUG github:https://githu ...
- 基于Server-Sent Event的简单在线聊天室
Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...
- 基于JQuery+JSP的无数据库无刷新多人在线聊天室
JQuery是一款非常强大的javascript插件,本文就针对Ajax前台和JSP后台来实现一个无刷新的多人在线聊天室,该实现的数据全部存储在服务端内存里,没有用到数据库,本文会提供所有源程序,需要 ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- 分享基于 websocket 网页端聊天室
博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...
- 在线聊天室的实现(1)--websocket协议和javascript版的api
前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...
- 百度前端面试题-类似slack的在线聊天室
别人国庆出去玩,我在家写代码的感觉也是很不错哒. 首先介绍一下技术架构吧! 使用了js框架:FFF,zepto,jquery,md5.min.js 前端框架:Bootstrap 后端:野狗,部分PHP ...
- workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)
workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...
随机推荐
- Miller_rabin算法+Pollard_rho算法 POJ 1811 Prime Test
POJ 1811 Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 32534 Accepted: 8 ...
- PAT甲级1089. Insert or Merge
PAT甲级1089. Insert or Merge 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.每次迭代,插入排序从输入数据中删除一个元素,在排序列表中找到 ...
- 破解ZendStudio 10.1
破解文件的网盘地址: http://pan.baidu.com/share/link?shareid=3562282358&uk=1543766223
- <摘录>linux signal 列表
Linux 信号表 Linux支持POSIX标准信号和实时信号.下面给出Linux Signal的简表,详细细节可以查看man 7 signal. 默认动作的含义如下: 中止进程(Term) 忽略 ...
- oracle linux 7.3 dtrace 安装
[root@localhost dtrace]# uname -r -.el7uek.x86_64 [root@localhost dtrace]# cat /etc/oracle-release O ...
- jquery empty()方法
empty() 方法从被选元素移除所有内容,包括所有文本和子节点. $(selector).empty() <html> <head> <script type=&quo ...
- QT 异步函数转为同步函数的方法
在QT中,一般推荐使用异步函数.除了异步函数的非阻塞特性外,QT的Signal/Slot特性在异步函数中可以得到充分的发挥.因此,在QT中,很多API的设计都是使用非阻塞的异步函数作为API,然后执行 ...
- Node.js:Stream(流)
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...
- hadoop中典型Writable类详解
本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable.html,转载请注明源地址. Hadoop将很多Writable类归入org.apac ...
- linux查看当前shell的方法
这篇文章主要对比一下 source 命令执行shell文件和 ./ping.sh 这种方式执行shell文件的区别. 1. source ping.sh 这个是在当前的shell 中执行 ping ...