小弟新人一枚,刚刚学习了网络编程的基础,就试着用UDP协议实现一个简单的“聊天室”,在写代码过程中也是各种出错,还好最终是实现了各种最基本的功能,在此记录一下当时写代码时的各种问题,希望跟我一样的新人能够避免某些常见问题,同时也希望能够得到大神的指点,看看代码还有哪里可以更加精简,更加效率。
首先我先来介绍一下实现这个聊天室的服务器端和客户端的大概流程,一会会把流程图传上来。
先说一下这个聊天室的基本功能吧。这个聊天室能实现:
1 用户登录时能够获取用户在终端上输入的名字,然后给各个在线的用户发送“XXX login”的登录提示;
2 用户下线是会给各个在线用户发送“XXX offline”的下线提示;
3 可以从服务器端给所有在线用户发送广播信息;
4 当然了,每个在线用户发的信息会发送给所有在线用户,形式如“XXX:。。。。”;
5 还有就是退出功能,当用户给服务器发送“quit”的时候,用户会下线,断开与服务器的连接;
基本功能就是这些了,下面我们在介绍要想实现这些个基本功能所要要求客户端和服务器所需要做些什么:
客户端:
客户端的话,根据我们上面的描述,它所要做的就是在用户登录时输入自己的名字,然后把这个名字信息发送给服务器,然后服务器需要广播给各个在线用户;还有就是接受服务器发送过来的各种信息。基本功能就是如此,至于其余细节问题我们一会在说。
服务器:
服务器端的主要功能就是接受客户端发送过来的各种指令,然后做出相应的回应。用户在登录,下线,聊天的时候要进行广播,服务器自己也可以发广播;
基本功能了解了,下面就是开始具体分析怎么去实现这些个功能了。
首先我们发现,聊天的时候我们肯定不想要被阻塞,也就是说我们可以随心所欲的发送和接受信息,所以在这里我们采用进程来解决发送和接受阻塞的问题;
再者,经过我们分析,发送的信息基本上可以分为3类:第一类,也就是用户登录信息,服务器接受到这种类型信息之后会广播所有用户;第二类,用户聊天的信息,服务器也会广播所有用户;第三类,用户退出信息。我们暂且把第一类信息类型定义为L,第二类为B,第三类为Q,这样在写程序的过程中会比较容易区分。先实现第一个功能吧,就是登录时发送登录信息,我们可以看到,登录信息中包含名字,login还有信息类型3部分,那么在这里我们可以用一个结构体来包含他们:
typedef struct
{
char name[N];
char text[N];
char type;
}MGS;
MSG msg;
这里面name[N]包含的是用户的名字信息,text[N]包含的是用户发送消息的内容,剩下的type就是信息的类型了,这样我们就可以一次性send一个结构体,把他们都发送过去了。比如显示用户登录消息,我们就可以这样做:
客户端:
fgets(msg.name,N,stdin);
msg.name[st