天天看點

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;
				}
			}
		}
		
	}	
}
           

謝謝。

繼續閱讀