您的位置:首页 > 其它

关于即时通信小项目的整理总结

2016-05-12 21:28 239 查看
1.客户端界面:

登录界面:

用户名,端口号,主机名

聊天界面:

聊天数据和在线用户列表

2.服务器界面:

端口号和在线用户列表

项目启动第一步:服务器输入端口号后,点击启动服务器,这里发生了什么事情?这里,服务器立刻启动一个线程,暂且叫做serverConnectionThread,用于和客户端建立连接,当然,这里是必须用线程处理的,因为界面程序,费时操作是选择在新线程处理的,避免界面阻塞。好,那么这个serverConnectionThread启动后会做什么事情呢?负责监听与之相连的客户端,好的,回到客户端,当用户点击登录按钮之后会发生什么事情呢,当然,客户端也会启动一个线程,叫做clientConnectionThread,在这里会基于socket与服务器建立连接,好的连接后,会向服务器将自己的用户名发送过去,再回到服务器端,验证用户名后,重新启动一个线程,为什么呢?因为serverConnectionThread只负责与用户进行连接,连接成功后,会启动新线程与客户端进行消息的发送,我们将这个线程叫做sendMessageThread,那么到这里为止,每一个用户都能对应服务器端的一个线程进行通信了,所以创建新线程的时候,将用户名和线程作为key和value放在map里,至于用什么的map呢?并发的线程安全的hashmap。目前线程基本建立完毕了。重新回到客户端,客户端登录成功后,服务器会拿到用户名,更新用户列表,同时向客户端回传用户列表,那么服务器端可以更新用户列表,服务器向客户端回送怎么收到呢?先通过解析字符串吧,clientConnectionThread的run方法负责接收服务器端发过来的消息,在一个循环里不断接收。那好,接到用户列表就更新了。那么当客户端通过聊天界面发送消息时,怎么收到呢?好,那我们回到聊天界面,首先,会为发送按钮绑定监听器,通过sendMessage()方法,将聊天数据传送到服务器,好了,服务器的serverMessageThread的run方法也是一直监听用户发来的消息,当是聊天数据的时候呢,就会得到内容,得到那个map集合,向每一个用户回传消息,群聊就在这里体现了,那么单聊呢,就在这里选择一下就行了,在map集合里选择指定的用户。所以这个数据就会回到clientConnectionThread的run方法里面,得到后,显示内容。好了,下一个问题,重新回到客户端,当点击关闭按钮时候怎么办呢?这里也从按钮点击开始,也相当于是发送了一个消息,服务器的serverMessageThread在run方法里面收到后,会在map里面删除这个用户,然后更新用户列表,这里面有一个细节,注意将这个用户的连接断开,并将这个线程退出。再有一个就是服务器端关闭的问题,这个好处理,服务器向每一个用户发送关闭的消息,然后服务器退出,用户也推出。

所以,serverMessageThread实际上接收哪几种用户消息类型呢?聊天数据,关闭客户端都在这个线程里面处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: