知识储备:java群聊系统

Java群聊系统下载:http://download.csdn.net/detail/a362523/8920729
项目迭代1
服务端的启动会开启三个线程,一个用于监听客户端的连接(接收用户名登录的信息),一个用户用于接收客户端发送过来的聊天信息。用于存放所有客户端的信息(发送的数据 + 用户名 + 端口号)

第一个线程t1的工作:
接收用户登录的请求,接收用户登录的基本信息(端口号 + 用户名)
while循环中包括的内容有:
accept监听 + 客户端用户的基本信息包括用户名) + 一些额外的信息(客户端的)

  • 解析数据:username@@@port1_port2_address
  • 判断用户是否重复登录:如果有重复,则向客户端发送错误消息,(将用户名和端口号存在服务器的hashMap中),并关闭流(不在向该用户返回在线用户列表了);如果没有重复,将新的用户加入到在线用户列表中;更新服务器端在线用户列表,并把在线用户列表发送给每一个用户(这个就用到了客户端的ServerSocket,客户端接收用户的在线列表为AcceptUsersListThread,死循环,增加用户和删除用户都会更新)。

第二个线程t2的工作
用于处理用户聊天的信息,
遍历所有的客户将聊天数据发送出去

第三个线程t3的工作
服务端的关闭时通知所有客户端(遍历所有的客户信息)

客户端功能(两个界面:登录界面 + 聊天界面)
登录功能(用户名 + 服务器地址 + 端口号) + 客户端也有一个ServerSocket(这样服务端就能连接客户端,并且发送数据)

客户端涉及到的线程:
与服务器连接的线程(与服务器t1线程连接):
- 传递的数据为: 当前Frame + 主机IP + 端口号 + 用户名,
- 连接成功后,服务器向客户端返回在线用户列表
- 连接成功后,客户端也要当成服务器,产生两个随机数作为端口号(一个端口号用于接收消息、另一个端口号用于接收用户列表的端口号)
- 所以客户端向服务器真正传递的数据为:用户名 + 两个随机的端口号 + 客户端的ip地址(这样才能实现服务器向客户端发起连接)
- 数据的传输方式:自定义格式:username@@@port1_port2_address(但是最好的方式是以xml文件传输数据)(客户端登录时向服务器端所发送的信息,写入流)

t2维护用户列表的线程(AcceptUserListThread)
t3发送消息的线程)
t4接收消息的线程

客户端关闭线程

  • 告知服务器端已经关闭了,向服务器发送一个关闭字符串
  • 更新服务器端的在线用户列表
  • 将新的在线用户列表回传给所有的客户端

项目迭代2

服务器
一、服务器的启动
1、获取用户输入的端口号,创建服务器启动的线程(ServerConnection),在run方法中,死循环监听客户端的连接;(客户端登录会连接服务器,另外会把用户的信息发送给服务器)先读客户端发过来的信息,后写(登录成功或者失败的信息发送给客户端);这个时候转去编写客户端的内容
2、从流中读取客户端发送过来的XML数据信息(譬如:用户名),并解析XML,验证是否重复登录,如果没有,则将success信息写入流发送给客户端(转向客户端

二、服务器端在线用户列表的显示
连接成功后,又会创建一个新的线程(这个专门用于与特定的客户端聊天的线程,由ServerConnection生成 ),用于处理用户聊天的数据,每一个连接上的用户都会对应一个该聊天线程(ServerMessageThread:可以处理两件事情:跟新用户列表(服务器端 + 客户端) + 用户的聊天 + 关闭窗口)
1、用户在线列表的存储结构为:HashMap<用户名、ServerMessageThread>,放到Server类中,一个在线的用户刚好对应一个“聊天”的线程
2、创建好聊天线程之后,将连接成功的用户及其对应的ServerMessageThread线程放入Map中
3、更新用户列表(客户端 + 服务器):获取HashMap中key的值,转换成字符串,再设置server的在线用户列表
4、转去更新客户端的用户在线列表

三、聊天的实现(服务端)
1、接受客户端发送过来的聊天XML数据信息(Type),并解析
2、服务器向所有客户端发送聊天数据(数据格式为:“用户名:消息”):构造服务器端向所有客户端发送的XML数据(转去编写客户端代码)

四、服务器端关闭
1、构建服务器端关闭的XML数据(Type = 6表示服务器端关闭)
2、遍历客户端,将XML数据发给每个在线的用户
3、关闭客户端

五、客户端关闭时服务器端的操作
1、接受客户端发送过来的关闭窗口的XML数据
2、更新用户在线列表(更新服务端 + 客户端的用户列表)
3、构造服务器确认客户端关闭的XML信息(Type = 7)

客户端
一、客户端的“登录”,创建客户端连接服务器的线程(ClientConnection)
1、连接服务器,获得输入输出流(这个不用写到线程里面,因为是一次性的)
2、用户登录(这个也不用写到线程run方法中,也是一次性的),向服务器端发用户信息 (以XML格式传输数据:构建XML数据Document SaxReader Element,XML数据格式的构造和解析)(接着转向服务器,服务器端接受的数据都是XML形式的数据,因此要定义一个Type区分不同的XML数据)
3、登录成功则打开聊天窗口

二、客户端在线用户列表的显示

1、在服务端,将HashMap中的value(UserName)构造成XML的数据(Document Element asXML))
2、遍历与每一个用户对应的线程,在ServerMessageThread中将用户在线列表的XML数据发送出去
3、客户端连接的线程(ClientConnection线程用于处理与服务器交互的一切操作:聊天数据 + 用户在线列表 + 服务器端的关闭(通过xml的type信息识别))接受用户在线列表的信息(死循环 + XML信息)
4、解析用户在线列表的XML(SAXReader Document到List中),显示到客户端的在线用户列表上。

三、聊天实现(客户端)
两个步骤:客户端先将数据发给服务端,服务端再遍历所有的客户端,将聊天信息发给所有的客户端
1、向服务器端发送聊天数据(ClientConnection)(还是用Type区分聊天数据和关闭窗口的数据):构造聊天的XML数据,发送给服务器(转去服务器编写)
2、解析服务器端发送的数据(XML)并显示在客户端。

四、服务器端关闭时客户端的操作
1、接受服务器端发过来的XML数据并解析(Type = 6)
2、弹出提示窗口:服务器端已经关闭,并且关闭客户端

五、客户端的关闭
1、构造客户端窗口关闭的XML数据(用户名 + Type=5 )
2、客户端关闭流和关闭该客户端(转去服务器)
3、关闭流和结束该线程(break)

(三类线程:服务器连接的线程 + 服务器与客户端通讯的数据 + 客户端与服务器通讯的数据 数据的读会一直处于死循环 数据写是一次的的(譬如点击了按钮即发送消息,关闭了按钮即发送消息))

总结
这里写图片描述
1、服务器端创建一个绑定到特定端口的ServerSocket对象,并且启动线程死循环监听客户端的连接。
2、客户端登录的话会根据服务器的主机ip和端口号创建一个Socket对象,启动线程连接到指定的服务器。
3、连接成功后,服务端又会创建专门与客户端通信的线程。所以服务端的话会维护HashMap这样一个存储结构,HashMap的key是一个个与服务器连接了的用户,也就是在线用户列表,value的话是专门负责与这个用户进行通信的线程。然后通信的内容主要有三个方面的内容:登录成功后用户在线列表的更新、用户的群聊信息还有程序的退出后用户在线列表的更新。然后通信的数据类型采用的是XML格式的数据。

用户在线列表的更新:用户登录成功以后,会把用户基本信息封装成XML格式的数据,发送给服务端,服务端接收到这个XML数据之后解析出用户名,把这个新登录的用户添加到HashMap这个用户在线列表中;之后遍历整个HashMap,将新的在线的用户又封装成XML数据发送给每一个客户端显示。

群聊:一个用户发送的数据被服务器接收,服务器遍历所有的在线用户列表,将聊天信息发送给每一个客户端。

退出:服务端退出的时候,遍历HashMap这个用户在线列表,通知客户端“服务器已经关闭”;客户端关闭的时候,会给服务器发送一个消息,HashMap删除该用户,并更新在线用户列表。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值