天天看点

linux下自创网络编程聊天室(4)改进两点

总体设计

本聊天室系统采用了c/s形式。服务器主要是处理客户输入信息。首先要存储客户的个人资料,相当于注册。再有,在客户的聊天信息时,也要记录下客户的聊天记录,已备查看聊天记录所用。当然,服务器还有自己的动态数据处理。客户状态分为链接客户和非连接客户,我采用结构体存储链接客户信息,以链表来记录链接客户。而链接客户又分为登陆客户和未登陆客户,这就通过修改链表上客户的名字。当客户一链接客户服务端时,就给客户一个账号,也就是相当于注册信息,同时并发服务器一直在为连接用户创建线程。

本聊天室登陆界面

1.登录

2.注册

3.退出

登录

登录的账号必须注册,帐号密码必须匹配都对,登录的账号必须不在线

注册

注册账号id必须和已有的不同,注册时填写账号,密码以及昵称

退出

退出程序

登录成功后可以使用功能

你可以使用的功能如下\

1.查找好友

2.显示好友

3.删除好友

4.添加好友(需要先发送申请好友请求,对方同意才能添加,也有回复信息提示)

5.查看或修改个人信息

6.与好友发送私信              (不在线也能发)(消息都会有发送时候的时间显示)

7.群聊                                       (能查看当前参与群聊的有多少人,账号和昵称分别是多少)

8.与好友聊天窗口(屏幕分区输入输出)                               (屏幕上半部输出双方聊天信息,下方输入信息,类似QQ界面)

9.在线查看聊天记录

10.从服务器下载本人聊天记录

open.查看是否有新消息                                   (类似好友请求,好友私信等,如不看会保存,下次上线再次提示)

11.退出

现在新加好友之间传输文件,需要经过对方同意,否则不能传输

可以向服务器上传和下载文件

有一个系统新建就生成的超级管理员用户admin,别的用户名必须为纯数字id

超级管理员用户可以在多人聊天室里面查看聊天室人员情况,如果有人违反和谐,可以给其禁言或者踢出聊天室,也可以解除禁言

图解:

1.聊天室情况

linux下自创网络编程聊天室(4)改进两点

2.开始聊天以及查看

linux下自创网络编程聊天室(4)改进两点

3.管理员选择禁言人员

.

linux下自创网络编程聊天室(4)改进两点

4.解除禁言

linux下自创网络编程聊天室(4)改进两点

5.踢人kickpeople

linux下自创网络编程聊天室(4)改进两点

6.退出聊天室

linux下自创网络编程聊天室(4)改进两点

7.传输文件

linux下自创网络编程聊天室(4)改进两点
linux下自创网络编程聊天室(4)改进两点

界面还有待美化,以及功能还需完善,我会继续努力改进

主要代码如下:

//创建多人聊天室
void duorenliao(int fd,char id[20])
{
	system("play -q 11.wav  repeat 2");   	//播放进入聊天室的提示音
	char fa[1024];
	char shou[1024];
	memset(fa,0,1024);
	memset(shou,0,1024);
	if(strcmp(id,"admin")==0)
	{
		strcpy(fa,"您已进入聊天室,输入stop退出,输入look查看当前人,输入nospeak选择禁言,speak恢复,输入kickpeople选择人踢出");
	}
	else
		strcpy(fa,"您已进入聊天室,输入stop退出,输入look查看当前人");
	send(fd,fa,strlen(fa),0);
	strcpy(a[len],id);
	len++;					//每进入一个人,长度加1
	int i;
	X* p,*pmy;
	pmy=head;
	while(pmy)
	{
		if(strcmp(pmy->id,id)==0)
			break;
		pmy=pmy->next;
		
	}
	
	time_t timep;
	time(&timep);  			//时间函数
	while(1)				//建立聊天室基本信息
	{

			
		memset(shou,0,1024);
		recv(fd,shou,1024,0);
		if(pmy->stop==2)    //被提出聊天室
		{
			memset(fa,0,1024);
			strcpy(fa,"你被管理员踢出聊天室");
			send(fd,fa,strlen(fa),0);
			
			for(i=0;i<len;i++)
			{
				if(strcmp(a[i],id)==0)
				{
					while(i<len-1)
					{
						strcpy(a[i],a[i+1]);
						i++;
					}
				}				
			}
			len--;
			for(i=0;i<len;i++)
			{
				p=head->next;
				while(p)
				{
					if(strcmp(p->id,a[i])==0)
					{
						memset(fa,0,1024);
						sprintf(fa,"%s被踢出聊天室",id);
						send(p->fd,fa,strlen(fa),0);
						break;
					}
					p=p->next;
				}
			}
			pmy->stop=0;
			return;
			
			
			
			
		}
		if(strcmp(shou,"stop")==0)		//stop退出聊天室
		{
			for(i=0;i<len;i++)
			{
				if(strcmp(a[i],id)==0)
				{
					while(i<len-1)
					{
						strcpy(a[i],a[i+1]);
						i++;
					}
				}				
			}
			len--;
			for(i=0;i<len;i++)
			{
				p=head->next;
				while(p)
				{
					if(strcmp(p->id,a[i])==0)
					{
						memset(fa,0,1024);
						sprintf(fa,"%s退出聊天室",id);
						send(p->fd,fa,strlen(fa),0);
						break;
					}
					p=p->next;
				}
			}			
			return;
		}
		if(strcmp(shou,"look")==0)          //look查看聊天室有多少人,并显示出他们的昵称以及账号
		{
			memset(fa,0,1024);
			sprintf(fa,"当前聊天室有%d人,他们是:",len);
			send(fd,fa,strlen(fa),0);
			for(i=0;i<len;i++)
			{
				p=head->next;
				while(p)
				{
					if(strcmp(p->id,a[i])==0)
					{
						memset(fa,0,1024);
						sprintf(fa,"昵称是%s  账号是%s\n",p->name,p->id);
						send(fd,fa,strlen(fa),0);
						break;
					}
					p=p->next;
				}							
			}
			continue;
		}
		if(strcmp(shou,"nospeak")==0&&strcmp(id,"admin")==0)
		{
			memset(fa,0,1024);
			memset(shou,0,1024);
			strcpy(fa,"选择要禁言的id");
			send(fd,fa,strlen(fa),0);
			
			recv(fd,shou,1024,0);
			p=head->next;
			while(p)
			{
				if(strcmp(p->id,shou)==0)
					break;
				p=p->next;
			}
			memset(fa,0,1024);
			strcpy(fa,"你被管理员禁言");
			send(p->fd,fa,strlen(fa),0);
			p->stop=1;
			
			
			continue;
		}
		
		if(strcmp(shou,"speak")==0&&strcmp(id,"admin")==0)
		{
			memset(fa,0,1024);
			memset(shou,0,1024);
			strcpy(fa,"选择要解除禁言的id");
			send(fd,fa,strlen(fa),0);
			
			recv(fd,shou,1024,0);
			p=head->next;
			while(p)
			{
				if(strcmp(p->id,shou)==0)
					break;
				p=p->next;
			}
			memset(fa,0,1024);
			strcpy(fa,"你被管理员解除禁言");
			send(p->fd,fa,strlen(fa),0);
			p->stop=0;
			
			
			continue;
		}
		if(strcmp(shou,"kickpeople")==0&&strcmp(id,"admin")==0)
		{
			memset(fa,0,1024);
			memset(shou,0,1024);
			strcpy(fa,"选择要踢出的id");
			send(fd,fa,strlen(fa),0);
			
			recv(fd,shou,1024,0);
			p=head->next;
			while(p)
			{
				if(strcmp(p->id,shou)==0)
					break;
				p=p->next;
			}
			p->stop=2;    
			
			
			continue;
			
		}
		if(pmy->stop==1)
		{
			memset(fa,0,1024);
			strcpy(fa,"你被管理员禁言,别人无法收到你的消息");
			send(fd,fa,strlen(fa),0);
			
		}
		else
		{
			for(i=0;i<len;i++)        //发的消息对聊天室里所有人发出
			{
				p=head->next;
				while(p)
				{
					if(strcmp(p->id,a[i])==0&&strcmp(p->id,id)!=0)
					{
						memset(fa,0,1024);
						time(&timep);
						sprintf(fa,"%s%s say: %s",ctime(&timep),id,shou);
						send(p->fd,fa,strlen(fa),0);
						break;
					}
					p=p->next;
				}
			}
		}
		
	}	
}
           

谢谢。

继续阅读