基于UDP协议的控制台聊天程序
Posted Rcchio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于UDP协议的控制台聊天程序相关的知识,希望对你有一定的参考价值。
一、聊天程序的功能
1.能够登录账号、注册新账号
2.能够进行群聊
3.能够进行私聊
注:该程序对传统的聊天程序进行了简化:
1.服务器中只有一个群
2.新注册的账号,默认已经添加到该群中
3.私聊对象就在该群的在线好友中选择
二、聊天程序的架构
该程序采用经典的c/s架构,即采用客户端/服务器架构。
1.服务器的功能:
(1)保存用户的账号和密码信息
(2)根据客户端发送的各种类型的信息,进行相应的处理,如处理用户登录,用户注册,转发消息
2.客户端的功能:
1.注册新的账号
2.登录已有账号,接收和发送消息,进行聊天对话
三、具体实现
1.服务器程序
服务器程序的主体是一个无限循环,用于接收客户端发送的消息。
消息类型一共有四种,分别是登录请求、注册请求、群聊消息、私聊消息。这四种消息类型,可以用字符数组的第一个字符来进行区分,比如’L‘是Login的首字母,用来作为登录请求的标志,’R‘是Rigister 的首字母,用来作为 注册请 求的标志,’G‘是Group的首字母,用来作为群聊消息的标志,’P‘是Personal的首字母,用来作为私聊消息的标志。
(1)处理登录请求
将登录请求中的用户名和密码提取出来,与服务器存储的用户名和密码进行对比,若存在用户名和密码与之匹配,则进一步查看用户在线列表中是否存在该用户,如果已经存在该用户,则返回重复登录的信息,否则返回登录成功 的信 息,并将该用户加 入在线列表;若用户名匹配失败则返回未注册用户的信息,密码匹配失败则返回密码错误的信息,皆为登录失败。其中,可以用数据库或 者是文件来为服务器存储数据,本程序采用文件存储用户的账号和密码信息。
(2)处理注册请求
将注册请求中的设置的用户名和密码提取出来,与文件中存储的用户名进行匹配,若匹配成功,则已存在用户名,返回重复注册的消息。若无匹配的用户名则表示无人注册该用户名,将该用户名和密码 写入文件,并返回注册成功的信息。
(3)处理群聊消息
接收群聊消息时可以得到发送该消息的客户端的ip地址和端口号,根据ip地址和端口号,可以在用户在线列表中找出该消息的发送者的名称,加在该群聊消息的前面,并转发给所有在先的用户,实现群聊的功能。
(4)处理私聊消息
确定私聊消息的发送者的方法同群聊消息。转发私聊消息时还要确定接收者。可以让发送者在发送的私聊消息首部加上接收者的名字,服务器将该接收者提取出来,并判定该用户是否在线,如果在 线,则将私聊消息转发给该用户;如果 该用户不在线,则将在线的用户列表返回给发送者,让发送者根据此列表重新选择私聊对象。
2.客户端程序
客户端程序要满足发送消息和接收消息两个功能,发送消息和接收消息是独立进行的,因此发送消息和接收消息可以用两个线程或者是进程来实现。控制台下,如果通过多线程来实现发送消息和接收消 息的独立,则存在一个问题,即当 接收聊天消息频繁时,接收消息的线程占据控制台的控制权,发送消息输入到控制台时还没有输入完,接收到的消息又打印到了控制台中,中断了要输入的消息。因 此,客户端由两个控制台程序组成,其中一个是发送器,用来登录、注册 以及发送消 息,另外一个是显示器,用来接收和显示消息。当登录账号时从服务器接收到成功的响应时,则自动弹出显示器显 示消息。
为了可以在同一台主机上运行多个客户端,显示器必须分配不同的端口号。可以在发送器中运用随机函数产生一个端口号,并将该端口号写入到文件中,运行显示器程序时读取该文件中的端口号,建立 套接口,监听服务器转发来的消息。
同时,发送器将该端口号发送给服务器,因此服务器保存了该客户端的显示器的ip地址和端口号,从而将群聊或者是私聊信息准确的发送给该客户端显示器。
四、注意事项
作为聊天软件,服务器的作用至关重要,服务器如果崩溃,则整个聊天系统就会瘫痪。因此,防止服务器崩溃是一件至关重要的事。
有一个值得考虑的问题是如果客户端非正常退出,服务器仍然认为该客户端在线,依然将群聊消息转发给该用户,那么发送给该客户端的套接字就会出现问题。如果继续用该套接字监听其他消息类型,服务器就会崩溃。有一个解决办法是为服务器创建一个套接口,专门用来接收客户端发来的消息。将消息转发给客户端时,也创建一个临时的套接口,因此,即使该套接口出现了问题,也不会影响整个服务 器的性能。
以上是关于基于UDP协议的控制台聊天程序的主要内容,如果未能解决你的问题,请参考以下文章