实现的功能

注册

登录

查询单词

查询历史记录

大概思路

搭建tcp服务器,通过IO多路复用实现并发(伪并发)。注册:接收到客户端发来的数据,建立一张用户表,将注册信息存储到数据库的用户表中,不过存入之前要判断是否重名  数据可以是一个结构体  可以设置结构中的一个成员为客户端发送过来的指令 客户端根据指令判断是注册 登录 等等。登录同理,不过这时候服务器对数据库表的操作为查询,有注册成功 没有则做其他处理。登录成功后修改登录状态为在线  这个标志位同样存储在结构体中。查询单词 历史记录等同样是对数据库进行查找、插入操作等  这里就不作过多赘述。

下面直接将这个练手的小项目的详细代码分享给大家  希望能帮助到刚入门的你  博客写的不是很规范将就看看吧  内容中若有错误的地方还请指正

定义的结构体:

typedef struct message_user{char name[20];char passwd[20];char wordname[20];char meaning[128];int flags;//判断发送的指令int states;//用户是否在线int ifuser;//用户名是否存在int loginflags;// 1成功 2 密码错误 3 用户名不存在int ifinsearch;//是否查找到对应单词 0没有 1查到int histroyflags;//1 byuser 2 bywordnamechar result[48][128];//历史记录int num;//查询的记录条数int column;//字段个数
}info;

注册

int Register(int connfd,sqlite3 *db)
{char buf[128] = {0};int ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}strcpy(buf,"create table if not exists user(name char[10],passwd char[20]);");char *errmsg = NULL;ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}
b: bzero(buf,sizeof(buf));sprintf(buf,"select * from user where name='%s';",message.name);char **result;int num = 0;int column = 0;if(sqlite3_get_table(db,buf,&result,&num,&column,&errmsg) != SQLITE_OK){printf("%s\n",errmsg);return -1;}if(num > 0){message.ifuser = 1;//用户名已存在}else{message.ifuser = 0;//用户名不存在bzero(buf,sizeof(buf));sprintf(buf,"insert into user values('%s','%s');",message.name,message.passwd);if(sqlite3_exec(db,buf,NULL,NULL,&errmsg) < 0){printf("%s\n",errmsg);return -1;}}ret = write(connfd,&message,sizeof(message));if(ret < 0){perror("write");return -1;}if(message.ifuser == 1){ret = read(connfd,&message,sizeof(message));goto b;}printf("注册\n");return 0;}

登录

int Login(int connfd,sqlite3 *db)
{char buf[128] = {0};int ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}
a: sprintf(buf,"select * from user where name='%s' and passwd='%s';",message.name,message.passwd);char *errmsg = NULL;char **result;int num = 0;int column = 0;ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}if(num){message.loginflags = 1;message.states = 1;//表示在线//用户名存在且密码正确if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}}else{num = 0;bzero(buf,sizeof(buf));sprintf(buf,"select *from user where name='%s';",message.name);ret =sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);printf("%d\n",ret);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}//用户名存在密码错误if(num){message.loginflags = 2;if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(connfd,&message,sizeof(message)) < 0){perror("read");return -1;}goto a;}else{// 用户名不存在message.loginflags = 3;if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}goto a;}}printf("登陆\n");return 0;
}

查询单词

int Insearch(int connfd,sqlite3 *db)
{if(message.states != 1){if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}return 0;}char buf[128] = {0};char *errmsg = NULL;char **result;int num = 0;int column = 0;int ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){sqlite3_errmsg(db);return -1;}strcpy(buf,"create table if not exists word(word char[128],meaning char[512]);");ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf));strcpy(buf,"create table if not exists record(name char[20],time char[128]);");ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf));strcpy(buf,"create table if not exists wrecord(wordname char[20],time char[128]);");ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf));sprintf(buf,"select * from word where word='%s';",message.wordname);//查找单词ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}if(num == 0){message.ifinsearch = 0;if(write(connfd,&message,sizeof(message)) < 0 ){perror("write");return -1;}}else{bzero(buf,sizeof(buf));time_t t;time(&t);message.ifinsearch = 1;//查询到单词strcpy(message.meaning,result[3]);if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}sprintf(buf,"insert into record values('%s','%s');",message.name,ctime(&t));ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);//将查询用户记录到单词用户表中,记录时间if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}bzero(buf,sizeof(buf)) ;sprintf(buf,"insert into wrecord values('%s','%s');",message.wordname,ctime(&t));ret = sqlite3_exec(db,buf,NULL,NULL,&errmsg);//将查询记录插入到单词记录表中 记录当前时间if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}}printf("查询单词\n");return 0;
}

历史记录(查询的时候插入对应的表中  只需将表中的数据打印出来)

int Histroy_r(int connfd,sqlite3 *db)
{char **result;char *errmsg = NULL;int num = 0;int column = 0;char buf[128] = {0};int ret = 0;ret = sqlite3_open("wmk.db",&db);if(ret != SQLITE_OK){sqlite3_errmsg(db);return -1;}if(message.histroyflags == 1)//by user{strcpy(buf,"select * from record;");ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}message.num = num;message.column = column;bzero(message.result,sizeof(message.result));for(int i = 0;i<num * column;i++){strcpy(message.result[i],result[column + i]);}if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}/*for(int i = 0;i < num;i++){for(int j=0;j<column;j++,result++){printf("%s",*(result + 2));}//puts("\n");}*/}else{strcpy(buf,"select * from wrecord;");ret = sqlite3_get_table(db,buf,&result,&num,&column,&errmsg);if(ret != SQLITE_OK){printf("%s\n",errmsg);return -1;}message.num = num;message.column = column;bzero(message.result,sizeof(message.result));for(int i = 0;i<num * column;i++){strcpy(message.result[i],result[column + i]);}if(write(connfd,&message,sizeof(message)) < 0){perror("write");return -1;}}printf("查找历史记录\n");return 0;
}

下面是整个客户端的代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <unistd.h>
typedef struct message_user{char name[20];char passwd[20];char wordname[20];char meaning[128];int flags;//判断发送的指令int states;//用户是否在线 0 out 1 onlineint ifuser;//判断注册是否重名int loginflags;// 1成功 2 密码错误 3 用户名不存在int ifinsearch;//是否查找到对应单词 0没有 1查到int histroyflags;//1 byuser 2 bywordnamechar result[48][128];//历史记录int num;//查询的记录条数int column;//字段个数
}info;
info message = {0};
int Register(int sockfd)
{
a:  printf("请输入用户名:\n");fgets(message.name,sizeof(message.name),stdin);message.name[strlen(message.name) - 1] = '\0';printf("%s\n",message.name);printf("请输入密码:\n");fgets(message.passwd,sizeof(message.passwd),stdin);message.passwd[strlen(message.passwd) - 1] = '\0';printf("%s\n",message.passwd);if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("read");return -1;}if(message.ifuser == 1){printf("用户名已存在请重新输入\n");goto a;}else{printf("注册成功\n");}sleep(3);system("clear");return 0;
}
int Login(int sockfd)
{
b: printf("请输入用户名:\n");fgets(message.name,sizeof(message.name),stdin);message.name[strlen(message.name) - 1] = '\0';
c: printf("请输入密码:\n");fgets(message.passwd,sizeof(message.passwd),stdin);message.passwd[strlen(message.passwd) - 1] = '\0';if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}switch(message.loginflags){case 1:printf("登陆成功\n");sleep(3);break;case 2:{printf("密码错误,请重新输入\n");goto c;break;}case 3:{printf("用户名不存在,请重新输入\n");goto b;break;}}system("clear");return 0;}
int Insearch(int sockfd)
{printf("请输入你要查询的单词:\n");fgets(message.wordname,sizeof(message),stdin);message.wordname[strlen(message.wordname) - 1] = '\0';if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(message.states != 1){printf("您还未登陆,请先登陆\n");message.flags = 2;Login(sockfd);}else{if(message.ifinsearch == 0){printf("单词库没有此单词\n");sleep(3);system("clear");}else{printf("%s:%s\n",message.wordname,message.meaning);sleep(3);system("clear");}}return 0;}
int Histroy_r(int sockfd)
{
d:if(message.states != 1){message.flags = 2;printf("您还未登陆,请登陆\n");Login(sockfd);}else{int n = 0;printf("***1.by user***2.by wordname***\n");scanf("%d",&n);getchar();if(n==1){message.histroyflags = 1;if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}for(int i = 0;i < message.num;i++){printf("%s 在 %s查看了单词\n",*(message.result + 2*i),*(message.result+(2*i + 1)));}}else if(n == 2){message.histroyflags = 2;if(write(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}if(read(sockfd,&message,sizeof(message)) < 0){perror("write");return -1;}for(int i = 0;i < message.num;i++){printf("%s 在 %s时被查询了\n",*(message.result + 2*i),*(message.result+(2*i + 1)));}}else{printf("输入错误,请重新输入\n");goto d;}}sleep(3);system("clear");return 0;}
int main(int argc, char *argv[])
{ int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("sockfd");return -1;}printf("%d\n",sockfd);struct sockaddr_in saddr;bzero(&saddr,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = inet_addr("192.168.153.128");saddr.sin_port  = htons(8888);int ret = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(ret < 0){perror("connect");return -1;}printf("connect success\n");while(1){printf("-------欢迎来到英英词典--------\n");printf("-----1.注册-----2.登陆-----3.查询单词-----4.查看历史记录-----\n");
a:      scanf("%d",&message.flags);getchar();switch(message.flags){case 1:Register(sockfd);break;case 2:Login(sockfd);break;case 3:Insearch(sockfd);break;case 4:Histroy_r(sockfd);break;default:printf("输入错误,请重新输入\n");goto a;}// printf("++%d\n",message.states);}close(sockfd);return 0;
} 

如果都看到这儿了希望不要吝啬您的赞噢  您的阅读点赞是我能够继续坚持的最大动力

网络编程练手小项目---英英词典相关推荐

  1. C# Socket网络编程(附赠练手小项目)

    在公司花了两天的时间来研究Socket编程,感觉也还是学到了一点点皮毛,不过也还是有一点点的小成就. 配合Winform窗体界面,实现了简单的窗体间互相通信的小项目(可以互相发消息,服务器可以给客户端 ...

  2. 爬虫练手小项目:豆瓣高分图书TOP100

    爬虫练手小项目:豆瓣高分图书TOP100 import requests import re from requests.exceptions import RequestException impo ...

  3. Golang练手小项目系列

    Golang练手小项目系列 本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法. golang练手小项目系列(1)-位向量 golang练 ...

  4. go语言面向对象 练手小项目

    学习一门语言,最重要的就是动手,一个项目的代码写三遍,看起来笨的方法,实际上也是最快的方法. go语言的第一个练手小项目: 家庭收支记录软件的编写: 1.项目需求说明 模拟现实基于文本界面的<家 ...

  5. ssm练手小项目_20 个 JavaScript+Html+CSS 练手的小项目

    前言: 最近在 GitHub 上发现了一个 vanillawebprojects[1] 开源仓库,里面收集了 20 个 JavaScript+Html+CSS的练手项目,没有使用任何框架,可以让你从基 ...

  6. 台式小风扇(HTML+CSS+JS练手小项目)

    台式小风扇(HTML+CSS+JS练手小项目) 功能介绍 外观展示 HTML代码 CSS代码 JS代码 总结 功能介绍 前段时间看到这样的风扇特效,感觉还挺好玩,就自己也写一个练练手. 风扇有四个档位 ...

  7. 数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)

    文章目录 前言 正文(无删减) 我的想法(删减修改版) 数据导入与数据存储 功能实现 数据结构 用户结构 SIM卡结构 AVL树数据结构 哈希表结构 数据表 用户表 SIM卡表 时间安排 前言 本月主 ...

  8. html+css+js之20个练手小项目(一)

    html+css+js之20个练手小项目(一)--Hangman 前言 一.HTML 二.CSS 三.JS 前言 前端新手练习,记录不迷失. 主要练习html和CSS布局以及JS. 来源github, ...

  9. 练手小项目,爬取3DM图片

    博客原文:https://weweweha.com 1. 概述 ​ 爬取3DM指定网页的游戏壁纸,并且通过多线程来加速爬取图片的速度. 2.使用库 ​ request库用来1解析指定网页,re库用来搜 ...

  10. c语言模拟器怎么打程序,C语言初学者练手小项目——万花模拟器

    原标题:C语言初学者练手小项目--万花模拟器 还记得小时候玩的万花尺么?好好玩,各种不同的点距能画出各种各样形状图形. C语言程序万花尺模拟 函数功能:每隔5秒随机生成万花图形 并自动保存作图参数以及 ...

最新文章

  1. 怎样导出或导入Cookie
  2. jtag引脚定义_硬件学习之通过树莓派操控 jtag
  3. QML中定义JavaScript资源
  4. 直播马上开始|不要怂,一起上!关于黑客攻防,我们有话要说
  5. 《孙子兵法》【作战第二】
  6. CoreAnimation编程指南(九)图层布局
  7. qt 5编程入门(第2版)_《C++并发编程实战第2版》第六章:设计基于锁的并发数据结构(1/3)...
  8. GRUB中硬盘和分区编号,UUID
  9. 特斯拉将国产Model 3和Model Y后轮驱动版价格上调4752元
  10. 联想微型计算机beta2,联想上网本升级IdeaPad S10-2
  11. SPSS配对样本t检验
  12. 计算机领域 专利挖掘,浅谈如何进行软件专利的挖掘
  13. 北信源与天津麒麟签战略合作协议 共建国产信息安全生态圈
  14. 为什么有些公司不招大龄程序员?
  15. db2 matlab实现,MATLAB MIMO-OFDM无线通信技术及 实现一书的源码和配套英文书267万源代码下载- www.pudn.com...
  16. 加快onenote同步速度
  17. Problem_1 小鸡啄米
  18. 开涛的博客 spring
  19. 阿里云盘下载与公测预约(最新)
  20. 计算机绘制表格教案,《表格的制作》教学设计

热门文章

  1. 输入是一个只包含拼音的字符串,请输出对应的数字序列。
  2. php汉字转换拼音插件,汉字转换拼音的PHP库
  3. pb模型文件与.pbtxt配置不匹配导致OpenCV调用dnn模块出错(Mask R-CNN为例)
  4. 沙盘模拟软件_我院学生参加第十六届全国大学生“新道杯”沙盘模拟经营大赛喜获佳绩...
  5. access根据所属院系修改学号_2016年计算机二级《Access》冲刺试题及答案
  6. Java程序---学生管理系统的登录和注册
  7. 基于SpringBoot在线电影订票系统
  8. JavaScript 中URL编码方式
  9. Java蓝桥杯——Fibonacci数列
  10. ubuntu查看显卡驱动以及其他驱动