聊天室项目 客户端

客户端具体功能函数实现,完成测试运行

实现注册、登录、vip设置、发送表情、点赞等功能

#include "my_headfile.h"

struct send userInfo;
struct recv userBack;
int ret;
char fan[20];    //输入任意键返回
char Name[20];
int READEN = 0;
int State;
int LIKES = 0;
int OUT = 0;
struct tm *gettime(void)      //获取当前时间
{
	time_t now;
	struct tm *t;
	time(&now);
	t = localtime(&now);
	return t;
}
char* nowtime()                //将获取的时间以字符串返回
{
	time_t rawtime;
	struct tm * timeinfo;
	time(&rawtime);
	timeinfo = localtime(&rawtime);
	return asctime(timeinfo);
}
int mygetch()         //将密码数字转换为*(网上借鉴,不太懂)
{
	struct termios oldt,
		newt;
	int ch;
	tcgetattr(STDIN_FILENO, &oldt);
	newt = oldt;
	newt.c_lflag &= ~(ICANON | ECHO);
	tcsetattr(STDIN_FILENO, TCSANOW, &newt);
	ch = getchar();
	tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
	return ch;
}
void Welcome()            //启动客户端界面
{
	struct tm *t = gettime();
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************                欢  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************              欢迎  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************            欢迎来  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************          欢迎来到  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************        欢迎来到本  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************      欢迎来到本聊  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************    欢迎来到本聊天  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
	system("clear");
	printf("  ************************************************************\n");
	printf("\n");
	printf("  ********************  欢迎来到本聊天室  ********************\n");
	printf("\n");
	printf("  ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d  ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
	printf("\n");
	printf("                                                      Author:QXW    \n");
	printf("\n");
	printf("  ************************************************************\n");
	printf("\n");

	usleep(1000000);
}
//主界面显示
void show()
{
	system("clear");
	printf("**********************************欢迎使用本聊天室*****************************\n");
	printf("*                                                                             *\n");
	printf("*                                1、注册                                      *\n");
	printf("*                                2、登录                                      *\n");
	printf("*                                3、忘记密码                                  *\n");
	printf("*                                4、退出                                      *\n");
	printf("*                                                                             *\n");
	printf("*          为了维护本聊天室的数据安全和通信请勿登录超过10个客户端             *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n");
	printf("请输入相应的命令(如注册输入1):\n");
}
//注册界面显示及处理
int show_reg()
{
	char pass1[20];
	char pass2[20];
	int i = 0;
	int j = 0;
	system("clear");
	printf("\n\n\n\n");
	State = 0;     //禁言标志位
	userInfo.cmd = reg;
	userInfo.likes = 0;          //初始值
	userInfo.vip = 0;        //初始值
	printf("\t\t\t\t请输入账号:");
	scanf("%s", userInfo.account);

	printf("\n\t\t\t\t请输入密码:");

	while (i < 20)
	{
		pass1[i] = mygetch();
		if (pass1[i] == 10)
		{
			if (j == 0)     防止输入账号的最后一个回车影响
			{
				j++;
				continue;
			}
			break;
		}
		printf("*");
		i++;
	}
	pass1[i] = '\0';

	i = 0;
	printf("\n\n\t\t\t\t请确认您的密码:");
	while (i < 20)
	{
		pass2[i] = mygetch();
		if (pass2[i] == 10)
		{
			break;
		}
		printf("*");
		i++;
	}
	pass2[i] = '\0';

	printf("\n\n\t\t\t\t请设计您的昵称:");
	scanf("%s", userInfo.name);

	strcpy(userInfo.moto, "略略略(T_T)");

	printf("\n\n\t\t\t\t请输入密保问题:");
	scanf("%s", userInfo.question);
	getchar();

	printf("\n\n\t\t\t\t请输入密保答案:");
	scanf("%s", userInfo.answer);

	getchar();

	system("clear");
	printf("\n\n\n\n\n\n\n\t\t\t正在注册......\n");
	sleep(2);

	if (strcmp(pass1, pass2) != 0)          //比较前后输入密码是否一致
	{
		printf("\n\n\t\t\t\t密码输入有误!请重新注册!\n");
		printf("\n\n\n\t\t输入ENTER键返回:");
		fgets(fan, 20, stdin);
		return -9;
	}
	else
	{
		strcpy(userInfo.passward, pass1);
	}
}
//登录界面显示
int show_log()
{
	char pass1[20];
	int i = 0;
	int j = 0;
	system("clear");
	printf("\n\n\n\n\n\n\n");
	printf("\t\t\t\t请输入账号:");
	scanf("%s", userInfo.account);

	printf("\n\t\t\t\t请输入密码:");

	while (i < 20)
	{
		pass1[i] = mygetch();
		if (pass1[i] == 10)
		{
			if (j == 0)     防止输入账号的最后一个回车影响
			{
				j++;
				continue;
			}
			break;
		}
		printf("*");
		i++;
	}
	pass1[i] = '\0';

	strcpy(userInfo.passward, pass1);

	system("clear");
	printf("\n\n\n\n\n\n\n\t\t\t正在登录......\n");
	sleep(2);
}
//登陆之后界面显示及处理
int show_chat()
{
	system("clear");
	gettime();
	printf("\n%s   个性签名:%s   点赞数:%d", Name, userBack.moto, LIKES);
	if (userBack.vip == 1)
	{
		printf("\t\t超级会员");
	}
	else
	{
		printf("\t\t普通用户");
	}
	printf("\n\n\t\t a 私聊\n");
	printf("\t\t\t\t b 群聊\n");
	printf("\t\t c 查看在线人数\n");
	printf("\t\t\t\t d 发送表情\n");
	printf("\t\t e 点赞\n");
	printf("\t\t\t\t f 更改个性签名\n");
	printf("\t\t g 注册会员\n");
	printf("\t\t\t\t h 禁言(需开通会员)\n");
	printf("\t\t i 解禁(需开通会员)\n");
	printf("\t\t\t\t j 查看聊天记录\n");
	printf("\t\t k 退出\n");
	printf("\n\n\t\t请输入您的选择:");
}
//发送表情选择
int deal_send_expr(int sfd)
{
	char e[10];     //输入表情选项

	system("clear");
	printf("\n\n\n\n");
	if (State == Shutup)     //判断用户是否被禁言
	{
		printf("\n\n\n\n\t\t您处于被禁言状态!无法发言!开通会员可以解禁`(*∩_∩*)′\n");
		printf("\n\n\n\t\t输入ENTER键返回:");
		fgets(fan, 20, stdin);
		return Shutup;
	}

	printf("\n\t\t\t您想发表情给谁呢?:");
	scanf("%s", userInfo.toname);
	strcpy(userInfo.name, Name);
	userInfo.cmd = expression;

	printf("\n\n\t\t\t\t1 开心       :-D\n");
	printf("\t\t\t\t2 生气       = =#\n");
	printf("\t\t\t\t3 为你加油   *\(^_^)/*\n");
	printf("\t\t\t\t4 两手一摊   ╮( ̄▽  ̄)╭\n");
	printf("\t\t\t\t5 飞吻       づ ̄ 3 ̄)づ\n");
	printf("\t\t\t\t6 哭泣       (T_T)\n");
	printf("\t\t\t\t7 竖起大拇指 b( ̄▽ ̄)d\n");
	printf("\t\t\t\t8 不满       (︶︿︶)\n");
	printf("\t\t\t\t9 亲亲       >3<\n\n");
	printf("\t\t请输入您想发送的表情:");
	scanf("%s", e);
	getchar();

	userInfo.e_s = e[0];

	if (strcmp(Name, userInfo.toname) == 0)
	{
		sleep(1);
		system("clear");
		printf("\n\n\n\n\n\n\t\t不可以给自己发送表情哦`(*∩_∩*)′");
		printf("\n\n\n\t\t输入ENTER键返回:");
		fgets(fan, 20, stdin);
		return -1;
	}

	ret = write(sfd, &userInfo, sizeof(userInfo));  //将发送信息打包发送给服务器处理
	if (ret == -1)
	{
		perror("write");
		return -1;
	}
	system("clear");
	printf("\n\n\n\n\n\n\t\t正在发送...\n");
	sleep(2);
}
//分析表情信号
int back_ep()
{
	char er[20];
	switch (userBack.e_s)
	{
		case '1':
		{
			strcpy(er, ":-D");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '2':
		{
			strcpy(er, "= =#");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '3':
		{
			strcpy(er, "*\(^_^)/*");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '4':
		{
			strcpy(er, "╮( ̄▽  ̄)╭");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '5':
		{
			strcpy(er, "づ ̄ 3 ̄)づ");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '6':
		{
			strcpy(er, "(T_T)");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '7':
		{
			strcpy(er, "b( ̄▽ ̄)d");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '8':
		{
			strcpy(er, "(︶︿︶)");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		case '9':
		{
			strcpy(er, ">3<");
			system("clear");
			printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
			printf("\n\n\t\t%s\n", er);
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
		default:
		{
			system("clear");
			printf("\n\n\n\n\t\t抱歉!输入错误!/n");
			printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
			break;
		}
	}
}

//读线程
void* Read_from_server(int sfd)
{
	int i;
	while (1)
	{
		ret = read(sfd, &userBack, sizeof(userBack));      //接收服务器返回信息
		if (ret == -1)
		{
			perror("read");
			return;
		}
		READEN = 1;
		switch (userBack.result)
		{
			case (private_chat):         //私聊
			{
				system("clear");
				printf("\n\n\n\n\n\n\t\t%s 对您说了一句悄悄话:%s", userBack.from_name, userBack.msg);
				printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
				memset(&userBack.result, 0, sizeof(userBack.result));
				break;
			}
			case (group_chat):             //群聊
			{
				system("clear");
				printf("\n\n\n\n\t\t%s用户发送了一条信息:%s\n", userBack.from_name, userBack.msg);
				printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
				memset(&userBack.result, 0, sizeof(userBack.result));
				break;
			}
			case (online_member):        //在线人数
			{
				system("clear");
				printf("\n\n\n\n\t\t当前在线人数:%d\n", userBack.online_num);
				for (i = 0; i < userBack.online_num; i++)
				{
					printf("\n\n\t\t%s\n", userBack.num[i]);
				}
				printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
				getchar();
				memset(&userBack.result, 0, sizeof(userBack.result));
				break;
			}

			case (expression):        //发送表情
			{
				back_ep();
				memset(&userBack.result, 0, sizeof(userBack.result));
				break;
			}

			case (like):       //点赞
			{
				LIKES = userBack.likes;
				system("clear");
				printf("\n\n\n\n\n\n\t\t%s用户给你点了一个赞!`(*∩_∩*)′\n", userBack.from_name);
				printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
				memset(&userBack.result, 0, sizeof(userBack.result));
				break;
			}
			case (Shutup):      //禁言
			{
				State = Shutup;
				system("clear");
				printf("\n\n\n\n\n\n\t\t%s用户把您禁言了!开通会员可以解禁并反击他哦`(*∩_∩*)′\n", userBack.from_name);
				printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
				memset(&userBack.result, 0, sizeof(userBack.result));
				break;
			}
		}
	}
}
//处理登录后的请求
int deal_log(int sfd)
{
	char ecf[12];          //输入选择
	char x[2];                           //用于支付确认 
	char xzf[40];      //聊天文本名字
	char czf[2048];      //聊天记录

	while (1)
	{
		if (READEN == 1)
		{
			READEN = 0;
			switch (userBack.result)
			{
				case (Send_success):           //发送消息成功
				{
					system("clear");
					printf("\n\n\n\n\n\n\t\t发送成功!\n");
					memset(&userBack.result, 0, sizeof(userBack.result));
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}
				case (like_success):          //点赞成功
				{
					system("clear");
					printf("\n\n\n\n");
					printf("\n\n\t\t恭喜您点赞成功!`(*∩_∩*)′\n");
					memset(&userBack.result, 0, sizeof(userBack.result));
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}
				case (change_success):           //修改个性签名成功
				{
					system("clear");
					printf("\n\n\n\n");
					printf("\n\n\t\t恭喜您更改个性签名成功!`(*∩_∩*)′\n");
					memset(&userBack.result, 0, sizeof(userBack.result));
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}
				case (vip_success):             //申请vip成功
				{
					system("clear");
					printf("\n\n\n\n");
					printf("\n\n\t\t恭喜您成为超级会员!`(*∩_∩*)′\n");
					memset(&userBack.result, 0, sizeof(userBack.result));
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}
				case (Shutup_success):         //禁言成功
				{
					system("clear");
					printf("\n\n\n\n");
					printf("\n\n\t\t恭喜您对方已成功被您禁言!`(*∩_∩*)′\n");
					memset(&userBack.result, 0, sizeof(userBack.result));
					printf("\n\n\n\t\t输入ENTER键离开:");
					fgets(fan, 20, stdin);
					break;
				}
				case (Send_error):      //请求失败, 服务器未通过该请求
				{
					system("clear");
					printf("\n\n\n\n");
					printf("\n\n\t\t对不起,对方暂时没有登录!\n");
					memset(&userBack.result, 0, sizeof(userBack.result));
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}
			}
		}

		show_chat();

		fgets(ecf, 12, stdin);

		if (OUT == 1)
		{
			OUT--;
			return Exit;
		}

		switch (ecf[0])
		{
			case 'a':     //私聊
			{
				int fd1;
				system("clear");
				printf("\n\n\n\n");
				if (State == Shutup)     //判断是否被禁言
				{
					printf("\n\n\n\n\t\t您处于被禁言状态!无法发言!开通会员可以解禁`(*∩_∩*)′\n");
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}

				memset(czf, 0, strlen(czf));
				memset(xzf, 0, strlen(xzf));

				printf("\t\t\t您想和谁聊天呢?请输入对方名字:");  //聊天对象
				scanf("%s", userInfo.toname);
				getchar();
				printf("\n\n\t\t\t请输入您想要说的话:");       //聊天内容
				scanf("%[^\n]", userInfo.msg);
				getchar();

				userInfo.cmd = private_chat;     //通知服务器 有私聊请求

				strcpy(userInfo.name, Name);

				if (strcmp(Name, userInfo.toname) == 0)
				{
					sleep(1);
					system("clear");
					printf("\n\n\n\n\n\n\t\t不可以给自己发信息哦`(*∩_∩*)′");
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}

				ret = write(sfd, &userInfo, sizeof(userInfo));      //将相关信息打包发给服务端
				if (ret == -1)
				{
					perror("write");
					return -1;
				}

				sprintf(xzf, "%s与%s的聊天记录.txt", Name, userInfo.toname);        //保存聊天记录
				fd1 = open(xzf, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);   //打开保存聊天记录的文件
				if (fd1 == -1)
				{
					perror("open");
					return -1;
				}

				sprintf(czf, "%s 对 %s 发送了一句悄悄话:%s\t%s", Name, userInfo.toname, userInfo.msg, nowtime());
				ret = write(fd1, czf, strlen(czf));          //将聊天记录写入文件保存
				if (ret == -1)
				{
					perror("write");
					return -1;
				}
				printf("\n\n\t\t\t正在发送...\n");
				sleep(2);

				break;
			}
			case 'b':     //群聊
			{
				system("clear");
				printf("\n\n\n\n");
				int i = 0;

				if (State == Shutup)        //判断是否被禁言
				{
					printf("\n\n\n\n\t\t您处于被禁言状态!无法发言!开通会员可以解禁`(*∩_∩*)′\n");
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}

				printf("\n\n\n\n\n\t\t\t请输入您想要说的话:");
				scanf("%[^\n]", userInfo.msg);
				getchar();

				userInfo.cmd = group_chat;    //通知服务器 有群聊请求

				strcpy(userInfo.name, Name);

				ret = write(sfd, &userInfo, sizeof(userInfo));     //打包发给服务器
				if (ret == -1)
				{
					perror("write");
					return -1;
				}
				system("clear");
				printf("\n\n\n\n\n\t\t\t正在发送...\n");
				sleep(2);

				break;
			}
			case 'c':     //查看在线人数
			{
				userInfo.cmd = online_member;           //通知服务器 查看在线人数请求

				ret = write(sfd, &userInfo, sizeof(userInfo));
				if (ret == -1)
				{
					perror("write");
					return -1;
				}

				system("clear");
				printf("\n\n\n\n\n\n\t\t...\n");
				break;
			}
			case 'd':     //发送表情
			{
				deal_send_expr(sfd);
				break;
			}
			case 'e':     //点赞
			{
				userInfo.cmd = like;        //通知服务器 有点赞请求
				system("clear");
				printf("\n\n\n\n\n\n\t\t您比较欣赏谁呢?`(*∩_∩*)′请告诉我:");
				scanf("%s", userInfo.toname);
				getchar();
				strcpy(userInfo.name, Name);

				if (strcmp(Name, userInfo.toname) == 0)
				{
					sleep(1);
					system("clear");
					printf("\n\n\n\n\n\n\t\t不可以给自己点赞哦`(*∩_∩*)′");
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}

				ret = write(sfd, &userInfo, sizeof(userInfo));     //将信息打包发给服务器
				if (ret == -1)
				{
					perror("write");
					return -1;
				}
				printf("\n\n\t\t请稍等...\n");
				sleep(2);
				break;
			}
			case 'f':     //更改个性签名
			{
				userInfo.cmd = motto_change;      //通知服务器 有更改个性签名请求
				system("clear");
				printf("\n\n\n\n\n\n\t\t您想要一个什么样的个性签名呢?\n\n\n\t\t\t\t");
				scanf("%s", userInfo.moto);
				getchar();

				strcpy(userInfo.name, Name);

				ret = write(sfd, &userInfo, sizeof(userInfo));      //将信息打包发给服务器
				if (ret == -1)
				{
					perror("write");
					return -1;
				}
				printf("\n\n\t\t请稍等...\n");
				sleep(2);
				break;
			}
			case 'g':     //注册会员
			{
				if (userBack.vip == 1)
				{
					system("clear");
					printf("\n\n\n\n\n\n\t\t\t您已经是超级会员了!`(*∩_∩*)′\n");
					printf("\n\n\n\t\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
				}
				else if (userBack.vip == 0)
				{
					system("clear");
					printf("\n\n\n\t您好,请先支付200元,然后就能永久享受vip权限了!`(*∩_∩*)′\n");
					printf("\n\n\n\n\n\t确认支付吗?(y/n)");
					scanf("%s", x);
					getchar();

					if (x[0] == 'y')
					{
						strcpy(userInfo.name, Name);
						userInfo.vip = 1;
						userInfo.cmd = Vip;       //通知服务器有申请vip请求 

						ret = write(sfd, &userInfo, sizeof(userInfo));  //将信息打包发给服务器
						if (ret == -1)
						{
							perror("write");
							return -1;
						}
						printf("\n\n\t\t请稍等...\n");
						sleep(2);
					}
				}
				break;
			}
			case 'h':     //禁言
			{
				if (userBack.vip == 0)       //判断是否是会员
				{
					system("clear");
					printf("\n\n\n\n\n\n\t\t您还没有开通会员,请先开通会员!`(*∩_∩*)′\n");
					printf("\n\n\n\t\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
				}
				else if (userBack.vip == 1)
				{
					system("clear");
					printf("\n\n\n\n\n\n\t\t您想让谁闭嘴呢?`(*∩_∩*)′请告诉我:");
					scanf("%s", userInfo.toname);
					getchar();
					userInfo.cmd = Shutup;       //通知服务器  有禁言请求
					strcpy(userInfo.name, Name);

					if (strcmp(Name, userInfo.toname) == 0)
					{
						sleep(1);
						system("clear");
						printf("\n\n\n\n\n\n\t\t不可以给自己禁言哦`(*∩_∩*)′");
						printf("\n\n\n\t\t输入ENTER键返回:");
						fgets(fan, 20, stdin);
						break;
					}

					ret = write(sfd, &userInfo, sizeof(userInfo));      //将信息打包发给服务器
					if (ret == -1)
					{
						perror("write");
						return;
					}
					printf("\n\n\t\t请稍等...\n");
					sleep(2);
				}
				break;
			}
			case 'i':     //解禁
			{
				if (State == 0)
				{
					system("clear");
					printf("\n\n\n\n\n\n\t\t您没有被禁言!尽情聊天吧`(*∩_∩*)′\n");
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
				}
				else if (State == Shutup)
				{
					if (userBack.vip == 0)
					{
						system("clear");
						printf("\n\n\n\n\n\n\t\t您还没有开通会员,请先开通会员!`(*∩_∩*)′\n");
						printf("\n\n\n\t\t输入ENTER键返回:");
						fgets(fan, 20, stdin);
					}
					else if (userBack.vip == 1)
					{
						system("clear");
						printf("\n\n\n\n\n\n\t\t您想现在解禁吗!(y/n):");
						scanf("%s", x);
						getchar();

						if (x[0] == 'y')
						{
							State = 0;
							system("clear");
							printf("\n\n\n\n\n\n\t\t恭喜您成功解禁!尽情去嗨皮啊!`(*∩_∩*)′\n");
							printf("\n\n\n\t\t输入ENTER键返回:");
							fgets(fan, 20, stdin);
						}
					}
				}
				break;
			}
			case 'j':     //查看聊天记录
			{
				system("clear");
				char n[20];
				char mcf[60];
				char ncf[2048];
				char kl;
				int fd2;
				int i = 0;
				printf("\n\n\n\n\n\n\t\t您想看和谁的聊天记录呢?");
				scanf("%s", n);
				getchar();
				sprintf(mcf, "%s与%s的聊天记录.txt", Name, n);
				fd2 = open(mcf, O_RDONLY, S_IRUSR | S_IWUSR);
				if (fd2 == -1)
				{
					system("clear");
					printf("\n\n\n\n\n\n\n\t\t\t您与%s还没有聊天记录!快去聊天吧`(*∩_∩*)′\n", n);
					printf("\n\n\n\t\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}

				while (1)          //循环读出文件里聊天的内容
				{
					memset(&kl, 0, sizeof(kl));
					ssize_t read_bytes = read(fd2, &kl, sizeof(kl));
					if (read_bytes == -1)
					{
						perror("read");
						return -1;
					}
					if (read_bytes == 0)
					{
						break;
					}
					ncf[i] = kl;
					i++;
				}
				ncf[i] = '\0';

				printf("\n%s\n", ncf);

				printf("\n\n\n\t\t输入ENTER键返回:");
				fgets(fan, 20, stdin);
				break;
			}
			case 'k':     //退出
			{
				userInfo.cmd = exit;      //通知服务器  有退出请求
				strcpy(userInfo.name, Name);

				ret = write(sfd, &userInfo, sizeof(userInfo));
				if (ret == -1)
				{
					perror("write");
					return -1;
				}
				return Exit;
			}
			case 10:     //ENTER键返回刷新界面
			{
				break;
			}
			default:
			{
				system("clear");
				printf("\n\n\n\n");
				printf("\n\n\t\t请输入a--k之间的选择!\n");
				printf("\n\n\n\t\t输入ENTER键返回:");
				fgets(fan, 20, stdin);
				break;
			}
		}

	}

}
int main()
{
	int sfd;
	char bcf[2];
	pthread_t ReadId;

	sfd = socket(AF_INET, SOCK_STREAM, 0);     //申请新的socket
	if (sfd == -1)
	{
		perror("socket");
		return -1;
	}

	struct sockaddr_in serveraddr;

	memset(&serveraddr, 0, sizeof(struct sockaddr));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(PORT);
	serveraddr.sin_addr.s_addr = inet_addr("192.168.111.128");

	ret = connect(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));       //将sfd连接至指定的服务器网络地址 serveraddr
	if (ret == -1)
	{
		perror("connect");
		close(sfd);
		return -1;
	}

	Welcome();

	while (1)
	{
		show();
		scanf("%s", bcf);

		switch (bcf[0])
		{
			case '1':    //注册
			{
				if (show_reg() == -9)
				{
					break;
				}
				else
				{
					write(sfd, &userInfo, sizeof(userInfo));       //将信息打包发给服务器
					memset(&userInfo, 0, sizeof(userInfo));

					memset(&userBack, 0, sizeof(userBack));
					read(sfd, &userBack, sizeof(userBack));          //接收服务器返回信息

					if (userBack.result == reg_success)
					{
						printf("\n\n\t\t\t\t恭喜您注册成功!\n");
						printf("\n\n\n\t\t输入ENTER键返回:");
						fgets(fan, 20, stdin);
					}
					else if (userBack.result == existing_acc)
					{
						printf("\n\n\t\t\t\t该账户已被注册!请重新注册!\n");
						printf("\n\n\n\t\t输入ENTER键返回:");
						fgets(fan, 20, stdin);
					}
					break;
				}
			}
			case '2':    //登录
			{
				userInfo.cmd = log;
				show_log(&userInfo);
				write(sfd, &userInfo, sizeof(struct send));     //将信息打包发给服务器

				read(sfd, &userBack, sizeof(userBack));           //接收服务器返回信息

				if (userBack.result == log_success)
				{
					strcpy(Name, userBack.from_name);
					LIKES = userBack.likes;
					printf("\n\n\t\t\t\t恭喜您登录成功!\n");
					sleep(2);

					pthread_create(&ReadId, NULL, (void*)Read_from_server, (void*)sfd);   //创建线程处理部分请求
					pthread_detach(ReadId);

					ret = deal_log(sfd);
					if (ret == Exit)
					{
						break;
					}
				}
				else if (userBack.result == error)
				{
					printf("\n\n\t\t\t\t账号密码错误!请重新登录\n");
					sleep(2);
				}
				else if (userBack.result == logged_acc)
				{
					printf("\n\n\t\t\t\t此账号已被登录!\n");
					sleep(2);
				}

				break;
			}
			case '3':    //忘记密码
			{
				char ans[100];
				userInfo.cmd = forget;       //通知服务器  有忘记密码请求    
				system("clear");
				printf("\n\n\n\n\n\n\t\t请输入您的账号:");
				scanf("%s", userInfo.account);

				ret = write(sfd, &userInfo, sizeof(userInfo));  //将信息打包发给服务器
				if (ret == -1)
				{
					perror("write");
					return -1;
				}

				ret = read(sfd, &userBack, sizeof(userBack));  //接收服务器返回信息
				if (ret == -1)
				{
					perror("read");
					return -1;
				}

				printf("\n\t\t   问题:%s", userBack.question);
				printf("\n\n\t\t请输入答案:");
				scanf("%s", ans);
				getchar();

				if (strcmp(ans, userBack.answer) == 0)
				{
					printf("\n\n\t\t您的密码是:%s 请妥善保管您的密码`(*∩_∩*)′\n", userBack.passward);

					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}
				else
				{
					system("clear");
					printf("\n\n\n\n\n\n\t\t抱歉,您的答案不对!\n");
					printf("\n\n\n\t\t输入ENTER键返回:");
					fgets(fan, 20, stdin);
					break;
				}

			}
			case '4':    //退出
			{
				system("clear");
				return 0;
			}
			default:
			{
				system("clear");
				printf("\n\n\n\n");
				printf("\n\n\t\t请输入1--3之间的选择!\n");
				sleep(2);
				break;
			}
		}
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的基于Socket的Python聊天室项目可以分为两个部分:服务器端和客户端。下面分别介绍这两部分的实现。 服务器端: ```python import socket import threading # 创建一个Socket对象 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置IP地址和端口号 server.bind(('localhost', 8080)) # 最大连接数 server.listen(5) # 存储所有客户端Socket的列表 clients = [] def broadcast(msg): """ 向所有客户端广播消息 """ for client in clients: client.send(msg) def handle_client(client_socket): """ 处理客户端发来的消息 """ while True: try: msg = client_socket.recv(1024) if msg: # 将消息广播给所有客户端 broadcast(msg) except: # 客户端断开连接 clients.remove(client_socket) client_socket.close() break while True: # 接受客户端连接 client, address = server.accept() clients.append(client) print(f'{address} connected.') # 创建一个线程处理客户端消息 client_thread = threading.Thread(target=handle_client, args=(client,)) client_thread.start() ``` 客户端: ```python import socket import threading # 创建一个Socket对象 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置服务器IP地址和端口号 server_address = ('localhost', 8080) # 连接服务器 client.connect(server_address) def receive(): """ 接收服务器发送的消息 """ while True: try: msg = client.recv(1024) print(msg.decode('utf-8')) except: client.close() break def send(): """ 向服务器发送消息 """ while True: try: msg = input() client.send(msg.encode('utf-8')) except: client.close() break # 创建两个线程分别接收和发送消息 receive_thread = threading.Thread(target=receive) send_thread = threading.Thread(target=send) # 启动线程 receive_thread.start() send_thread.start() ``` 这个聊天室项目可以实现多个客户端通过服务器进行聊天的功能。需要注意的是,这只是一个简单的示例,实际中还需要考虑很多问题,例如客户端和服务器的异常处理、消息的格式、消息的加密等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值