⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.cpp

📁 字读模式的多人聊天系统
💻 CPP
字号:
#include<Winsock2.h>
#include<iostream.h>
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<winuser.h>
#include<conio.h>
#pragma comment (lib,"user32")
#pragma comment (lib,"ws2_32")
//fd_set fdread;
SOCKET cliente;
//HANDLE h;
CRITICAL_SECTION rec_cs;
CRITICAL_SECTION send_cs;
char *buffer;
char username[6];
int chushihua()
{
	WORD version;
	WSADATA data;
	version=MAKEWORD(2,2);//获取版本信息
	int err=WSAStartup(version,&data);//进行初始化
	if(err!=0)
	{
		cout<<"初始化失败"<<endl;
		exit(0);
	}
		return err;
}
int connect()
{
	cliente=socket(AF_INET,SOCK_STREAM,0);//获取套接字
	sockaddr_in client;
	client.sin_family=AF_INET;
	client.sin_port=htons(6000);//设置端口号
	client.sin_addr.s_addr=inet_addr("127.0.0.1");//设置服务器的IP
int 	 err1=connect(cliente,(sockaddr *)&client,sizeof(client));// 发起连接操作
	if(err1!=0)
	{
	cout<<"不能和服务器建立连接,请检查网络"<<endl;
	exit(0);
	}
	return 0;
}
///////////////////////////////////////////////////////////////
void WINAPI recmessage()
{
	//接收消息的线程
	while(1)
	{
	int i2;
	i2=recv(cliente,buffer,1000,0);	//接受服务器转发来的消息
	EnterCriticalSection(&rec_cs);//进入临界区
	printf("%s\n",buffer);
	LeaveCriticalSection(&rec_cs);//离开临界区
	}	
}
/////////////////////////////////////////////////////////////
void welcom()
{
	//欢迎界面的设置
	cout<<"             ***************************************************"<<endl;
	cout<<"             *                                                 *"<<endl;
	cout<<"             *            欢迎登录聊天室                    *"<<endl;
	cout<<"             *        现在你可以聊天啦! ! ! ! !                *"<<endl;
	cout<<"             *     每句话不能太常    *"<<endl;
	cout<<"             *           esc为注销                             *"<<endl;
	cout<<"             *                                                 *"<<endl;
	cout<<"             ***************************************************"<<endl;
}
/////////////////////////////////////////////////////////////
int logging_regist()
{
	//注册和登录函数
	cout<<"              *********************************************"<<endl;
	cout<<"              *                                           *"<<endl;
	cout<<"              *		    欢迎来到聊天室             *"<<endl;
	cout<<"              *		 1为注册         2为登录          *"<<endl;
	cout<<"              *                                           *"<<endl;
	cout<<"              *********************************************"<<endl;
	int  flag=0;
	cout<<"登录还是注册"<<endl;
	for(;;)
	{
	cin>>buffer;
	if(strcmp(buffer,"1")==0||strcmp(buffer,"2")==0)
		break;
	else
	{
		printf("只能在1或者2中进行选择,请重新输入\n");
		continue;
	}
	}
	strcat(buffer,"#");//此时buffer中的第一个位置为标志位,标识到底是登录还是注册,后面用“#”与用户名隔开
	char *password,*password1;
	password=new char[10];//用来接收用户输入的密码信息,最多为十位
	password1=new char[10];//注册时用来接收密码验证和接受服务器发过来的注册或登录的相关信息(成功或者失败)
	if((strcmp(buffer,"1#")==0))
	{
		while(1)
		{
		cout<<"请输入你想要注册的用户名(#号除外)"<<endl;
		cin>>username;
		if(strlen(username)>5)
		cout<<"用户名过长,请重新输入"<<endl;//检查输入的用户名是否合法
		else
		{
			strcat(buffer,username);
			while(1)
			{
			cout<<"请输入密码"<<endl;
				for(int v=0;v<10;v++)
				{
					password[v]=getch();
					if(password[v]=='\r')
					{
						password[v]='\0';
						printf("\n");
						break;
					}
					putchar('*');
				}
			cout<<"请再次输入密码"<<endl;
			/*	for(int v=0;v<10;v++)
				{
					password[v]=getch();
					if(password[v]=='\r')
					{
						password[v]='\0';
						printf("\n");
						break;
					}
					putchar('*');
				}*///怎么在用上面的Getch()不能接受数据?
				cin>>password1;
			if(strcmp(password,password1)==0)
			{
				strcat(buffer,"#");//将用户名与密码用“#”分开
				strcat(buffer,password);
				if(connect()==0)
				{
				send(cliente,buffer,1000,0);//像服务器发送注册信息
			//	printf("%s",buffer);
				break;
				}
			}
			else
				cout<<"两次输入的密码不相等,请再次输入"<<endl;//处理两次密码输入不一致的情况
				
			}
			recv(cliente,password1,10,0);//接受来自服务器返回的注册信息
			printf("%s",password1);
			if(strcmp(password1,"succedreg")==0)
			{
				//检查是否注册成功
					cout<<"注册成功"<<endl;
					welcom();
					flag=1;
					break;
			}
				
			else
			{
				cout<<"注册失败"<<endl;
				continue;

			}
		}
		}		
		}
	if(strcmp(buffer,"2#")==0)
	{
		//处理登录问题
		cout<<"请输入用户名"<<endl;
		cin>>username;
		if(strlen(username)>6)
			cout<<"用户名过长"<<endl;
		else
		{
		strcat(buffer,username);
		strcat(buffer,"#");
		cout<<"请输入密码"<<endl;
		for(int v=0;v<10;v++)
				{
					password[v]=getch();
					if(password[v]=='\r')
					{
						password[v]='\0';
						printf("\n");
						break;
					}
					putchar('*');
				}
		strcat(buffer,password);
		if(connect()==0)
		{
		send(cliente,buffer,1000,0);
		}
		Sleep(2000);//延时等待服务器处理
		recv(cliente,password1,10,0);
		if(strcmp(password1,"succedreg")==0)
		{
			cout<<"登录成功"<<endl;
			welcom();
			flag=1;
		}
			else
			cout<<"登录失败"<<endl;
		}
	}
	return flag;
	}

//////////////////////////////////////////////////////////////
void main()
{
	buffer=new char[];
	char *word;
	word=new char[];// 用户输入的聊天内容
	char *a="";
	chushihua();
	int i=logging_regist();
	strcpy(buffer,a);
	if(i==1)
	{
	HANDLE RECHANDLE;//,SENDHANDLE;
	DWORD RECID;//,SENDID;
	RECHANDLE=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recmessage,NULL,0,&RECID);
	InitializeCriticalSection(&send_cs);//初始化临界区
	InitializeCriticalSection(&rec_cs);
	while(1)
	{
	EnterCriticalSection(&send_cs);
		strcpy(word,a);
	cin>>word;
	if(strcmp(word,"esc")==0)//发起注销操作
	{
			send(cliente,word,100,0);
			printf("注销成功\n");
			TerminateThread(RECHANDLE,RECID);
				exit(0);
	}
	else
	{
			strcpy(buffer,a);
	strcat(buffer,username);
	strcat(buffer,"说: ");
	strcat(buffer,word);
	send(cliente,buffer,strlen(buffer)+1,0);
	LeaveCriticalSection(&send_cs);
	}
	}
	}
	else
	exit(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -