嵌入式培训经验分享——网络编程项目实战(在线电子词典)

在线电子词典采用服务器+客户端模式,运用TCP协议通信,,服务器端直接连接数据库。

1、服务器实现
功能
注册设计:如果用户没有注册,必须注册才能提供服务―包括修改用户名密码
(1)判断用户名有没有注册,如果有就拒绝,给个提示.
(2)用户注册:保存到数据库中注册表中
(3)断开连接,给出提示,注册成功请登录/可以保持长链接登陆设计:使用用户名密码登陆,
(4)登录时查询数据库中注册表根据用户名和密码,如果没有给个提示,要求进行注册,
        如果有,那就保持连接,后续使用该链接为用户提供查询服务.
(5)退出,客户端发送断开请求,关闭客户端的进程号
(6)词典查询,登陆的客户发送查询词典-单词,服务器返回翻译结果
(7)历史查询记录,登陆的用户,每次用户查询都记录到历史表里面
(8)修改密码        1.登陆的用户才能操作

                                2.执行数据库中注册表更新密码;

                                3.修改密码之后要求用户重登陆.
2、数据库的设计
(1)注册表,用于记录用户注册的用户名和密码,在登录时进行比对
(2)历史记录表记录所有用户的查询记录,用户名日期查询单词
3、客户端
功能:
(1)配合服务器,向用户提供服务,向服务器发送请求
(2)printf scanf 提示用户如何操作和美化操作的界面
(3)自主定义协议和代码框架,服务器和客户端采用的协议必须一致

客户端:

#include <stdio.h>	 
#include <sys/types.h>          
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include "commen.h"
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <errno.h>

int num=0;
char pre_name[16];

void set_init(char board[20][100],int a)
{
	//初始化界面
	for(int x=0;x<a;x++)
	{	
		printf("%s",board[x]);
		printf("\n");
	}
	printf("请输入你要执行的选项:");
}
//查询单词
int do_client_search_word(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你要查找的单词
	printf("please input your search word:");
	scanf("%s",msg.word);
	strcpy(msg.name,pre_name);
	msg.cmd=4;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//查询成功
		printf("%s\n",msg.response);
		printf("%s\n",msg.word_buf);
	}
	else 
	{
		//查询失败
		printf("%s\n",msg.response);
	}
	return -34;
	
}

//注销用户
int do_client_delete_user(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你的用户名和密码
	printf("please input your name:");
	scanf("%s",msg.name);
	printf("please input your password:");
	scanf("%s",msg.passwd);
	
	msg.cmd=3;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//注销成功
		printf("%s\n",msg.response);
	}
	else 
	{
		//注销失败
		printf("%s\n",msg.response);
	}
	return -34;
}

//修改密码
int do_client_rev_passwd(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你的用户名和密码
	printf("please input your name:");
	scanf("%s",msg.name);
	printf("please input your password:");
	scanf("%s",msg.passwd);
	printf("please input your new password:");
	scanf("%s",msg.new_passwd);
	
	msg.cmd=6;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//修改密码成功
		printf("%s\n",msg.response);
	}
	else 
	{
		//修改密码失败
		printf("%s\n",msg.response);
	}
	return -34;
}

//查询历史
int do_client_history(int socket)
{
	struct dic_msg msg;
	struct history_serv_msg his_msg;
	memset(&his_msg,0,sizeof(his_msg));
	memset(&msg,0,sizeof(msg));
	
	msg.cmd=5;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	ret = recv(socket,&his_msg,sizeof(his_msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//查询历史成功
		printf("%s\n",msg.response);
		for(int i=0;i<(his_msg.nrow+1)*(his_msg.ncolum);i++)
		{
			printf("%-16s",his_msg.buf[i]);
			if((i+1) % his_msg.ncolum == 0 )
			{
					printf("\n");
			}
		}
	}
	else 
	{
		//查询历史失败
		printf("%s\n",msg.response);
		for(int i=0;i<(his_msg.nrow+1)*(his_msg.ncolum);i++)
		{
			printf("%-16s",his_msg.buf[i]);
			if((i+1) % his_msg.ncolum == 0 )
			{
					printf("\n");
			}
		}
	}
	return -34;
	
	return 0;
}


//查询操作
int do_search_dic(int socket)
{
	char xbuf[10];
	while(1)
	{
		int a;
		//初始化词典界面
		set_init(board_reg_success,11);
		scanf("%d",&a);
			 
		switch(a)
		{
			case 1: //查询单词
				do_client_search_word(socket);									
				break;
			case 2: //查询历史
				do_client_history(socket);
				break;
			case 3: //注销
				do_client_delete_user(socket);
				break;
			case 4:	//修改密码
				do_client_rev_passwd(socket);
				break;
			case 5: //退出
				return 0;
			default:
				printf("输入格式有误\n");
				fgets(xbuf,sizeof(xbuf),stdin);
				break;				
		}
	}
	return 0;
}

//登录操作
int do_loged(int socket)
{
	struct dic_msg msg;
	memset(&msg,0,sizeof(msg));
	//输入你的用户名和密码
	printf("please input your name:");
	scanf("%s",msg.name);
	strcpy(pre_name,msg.name);
	printf("please input your password:");
	scanf("%s",msg.passwd);
	
	msg.cmd=1;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//登录成功
		printf("%s\n",msg.response);
		do_search_dic(socket);
	}
	else 
	{
		//登录失败
		printf("%s\n",msg.response);
	}
	return -34;
}

//注册操作
int do_register(int socket)
{
	struct dic_msg msg;
loop:	
	memset(&msg,0,sizeof(msg));
	//设置你的用户名和密码
	printf("please set your name:");
	scanf("%s",msg.name);
	printf("please set your password:");
	scanf("%s",msg.passwd);
	
	msg.cmd=2;
	int ret = send(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client send err");
		return -3;
	}
	
	memset(&msg,0,sizeof(msg));
	ret = recv(socket,&msg,sizeof(msg),0);
	if(ret < 0)
	{
		perror("client recv err");
		return -3;
	}
	
	if(msg.ret ==0)
	{
		//注册成功
		printf("%s\n",msg.response);
	}
	else 
	{
		//注册失败
		printf("%s\n",msg.response);
		goto loop;
	}
}


int main(int argc,char **argv)
{	
	//创建套接字
	int socket_clie = socket(AF_INET,SOCK_STREAM,0);
	if(socket_clie < 0)
	{
		perror("socket creat err");
		return -1;
	}
	printf("socket success\n");
	//与服务器建立联系
	struct sockaddr_in serv_addr;
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(10060);
	serv_addr.sin_addr.s_addr = INADDR_ANY;//inet_addr("192.168.3.76");
	//int ret = connect(socket_clie,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
	if(ret < 0)
	{
		perror("connect err");
		return -3;
	}
	printf("connect success\n");
	
	while(1)
	{	
		int a;
		//初始化词典界面
		set_init(board_reg,10);
		scanf("%d",&a);
			 
		switch(a)
		{
			case 1: //登录
				do_loged(socket_clie);									
				break;
			case 2: //注册
				do_register(socket_clie);
				break;
			case 3: //退出
				break;
			default:
				printf("输入格式有误\n");
				break;				
		}
	}
	
	return 0;
}

需要更加详细的,可以看我的主页。(12条消息) 嵌入式培训经验分享——网络编程项目实战(在线电子词典)-网络基础文档类资源-CSDN文库

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在线词典项目描述: 版本号:v1.1 升级描述:1. 同时支持管理员(用户名:root,密码:1)和普通用户 2. 管理员可以查询所有用户的使用记录 服务器: 1. 支持并发服务器,每有一个客户端connect成功后,提示某某客户端已连接并打印客户端的ip和端口号。 2. 服务器程序可在任意IP地址上运行,并且允许IP地址快速重用 3. 接收到客户端的信息后,可以执行相应的操作:注册,登陆,退出 注册:接收到注册新用户指令后,可以创建sqlite3数据库,将用户名和密码存储到数据库的user表中(用户名name为primary key)。 登陆:接收到登陆命令,可以查询客户端输入的用户名和密码数据库中有没有,有的话跳到下一个菜单(查询单词,历史纪录,退出),没有的话打印错误信息。 查询单词:用户输入单词,服务器从dict.txt文件中遍历有无该单词,有的话打印释义,没有的话打印错误信息,并将用(户名,时间,单词)存储到数据库的history_record表中。(‘#’返回上一级菜单) 历史纪录:用户选择历史记录查询,服务器数据库的history_record表查询相同name的记录,每查询到一条,调用一次callback将信息发送到客户端,查询完毕后通知客户端。 退出:客户端退出,服务器打印"client exit!" 退出:客户端退出,服务器打印"client exit!" 客户端: 1. 客户端输入./client 192.168.23.128(服务器IP地址) 10000(端口号),参数格式不对或少报错,端口号不能小于5000,小于5000报错 2. 客户端支持注册,登陆,退出 注册:向服务器发送用户名和密码,接收服务器返回来的信息,注册成功/当前用户已存在 登陆:用户输入用户名和密码,客服端将用户名和密码发送给服务器,接收服务器返回的信息,如果OK,打印Login OK! 进入下一菜单(查询单词,历史纪录,退出),否则打印错误信息 查询单词:用户输入单词,客户端将单词发送给服务器服务器将释义返回给客户端,客户端将释义打印出来 历史纪录:用户选择历史记录查询,客户端将信息发送给服务器服务器循环把该用户的历史查询记录发送给客户端,客户端循环将其打印出来。 退出:客户端关闭套接字后结束进程 退出:客户端关闭套接字后结束进程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值