本程序采用P2P方式,各个客户端之间直接发消息进行聊天,服务器在其中只是起到协调的作用,下面先理清下程序的流程:
2.1程序流程设计
当一个新用户通过客户端登陆系统后,从服务器获取当在线的用户信息列表,列表信息包括系统中每个用户的地址,然后用户就可以单独向其他发消息。如果有用户加入或者在线用户退出时,服务器就会及时发消息通知系统中的所有其他客户端,达到它们即时地更新用户信息列表。
1.用户通过客户端进入系统,向服务器发出消息,请求登陆
2.服务器收到请求后,向客户端返回回应消息,表示同意接受该用户加入,并把自己(指的是服务器)所在监听的端口发送给客户端
3.客户端根据服务器发送过来的端口号和服务器建立连接
4.服务器通过该连接把在线用户的列表信息发送给新加入的客户端。
6.当用户退出系统时也要及时通知服务器,服务器再把这个消息转发给每个在线的用户,使客户端及时更新本地的用户信息列表。
2.2通信协议设计
所谓协议就是约定,即服务器和客户端之间会话信息的内容格式进行约定,使双方都可以识别,达到更好的通信。
下面就具体介绍下协议的设计:
1.客户端和服务器之间的对话
(1)登陆过程
①客户端用匿名UDP的方式向服务器发出下面的信息:
login,username,localIPEndPoint
消息内容包括三个字段,每个字段用“,”分割,login表示的是请求登陆;username表示用户名;localIPEndPint表示客户端本地地址。
②服务器收到后以匿名UDP返回下面的回应:
Accept,port
其中Accept表示服务器接受请求,port表示服务器所在的端口号,服务器监听着这个端口的客户端连接
③连接服务器,获取用户列表
客户端从上一步获得了端口号,然后向该端口发起TCP连接,向服务器索取在线用户列表,服务器接受连接后将用户列表传输到客户端。用户列表信息格式如下:
username1,IPEndPoint1;username2,IPEndPoint2;...;end
username1、username2表示用户名,IPEndPoint1,IPEndPoint2表示对应的端点,每个用户信息都是由"用户名+端点"组成,用户信息以“;”隔开,整个用户列表以“end”结尾。
(2)注销过程
用户退出时,向服务器发送如下消息:
logout,username,localIPEndPoint
这条消息看字面意思大家都知道就是告诉服务器username+localIPEndPoint这个用户要退出了。
2.服务器管理用户
(1)新用户加入通知
服务器向系统中每个用户广播如下信息:login,username,remoteIPEndPoint
在这个过程中服务器只是负责将收到的"login"信息转发出去。
(2)用户退出
与新用户加入一样,服务器将用户退出的消息进行广播转发:logout,username,remoteIPEndPoint
3.客户端之间聊天
用户进行聊天时,各自的客户端之间是以P2P方式进行工作的,不与服务器有直接联系,这也是P2P技术的特点。
聊天发送的消息格式如下:talk,longtime,selfUserName,message
协议设计介绍完后,下面就进入本程序的具体实现的介绍的。
三、程序的实现
服务器端核心代码:
然后用户可以双击在线用户进行聊天(此程序支持与多人进行聊天),下面是功能的演示图片:
四、总结
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。