在线电子词典采用服务器+客户端模式,运用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文库
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)