当前位置: 首页 > news >正文

网络编程项目(云词典项目)

目录

一、功能要求

服务器

用户客户端

二、演示效果 

1.登录、注册功能

2. 查单词功能

3.查看历史纪录功能

三、项目代码 

1.头文件

2.服务器

3.用户端

一、功能要求

仿照云词典的原理,实现云词典功能,用户可以查询输入的单词的英文解释,也可以查看历史记录。

服务器

处理客户端的请求,并将数据存入数据库中,客户端请求的数据从数据库进行获取,服务器转发给客户端。

用户客户端

实现账号的注册、登录功能,当登录成功时可以查单词、查看历史记录等功能。

二、演示效果 

1.登录、注册功能

2. 查单词功能

3.查看历史纪录功能

三、项目代码 

1.头文件

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sqlite3.h>
#include <signal.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>struct word_msg
{char word[20];   // 单词char parse[256]; // 含义
};typedef struct
{int acceptfd;         // 链接客户端unsigned char type;   // 功能类型 R:注册 L:登录 Q:查询 H:历史记录char name[32];        // 用户名char password[32];    // 密码char buf[1024];       // 调试信息struct word_msg msgg; // 单词信息
} MSG;

2.服务器

#include "head.h"fd_set readfds, tempfds;
sqlite3 *db;
MSG msg;void zhuce(MSG *msg);  // 注册
void denglu(MSG *msg); // 登录
void chaxun(MSG *msg); // 查询
void lishi(MSG *msg);  // 历史int main(int argc, char *argv[])
{if (argc != 2){printf("用法:<port>\n");return -1;}int sockfd = socket(AF_INET, SOCK_STREAM, 0);printf("sorkfd:%d\n", sockfd);struct sockaddr_in saddr, caddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = INADDR_ANY;socklen_t addrlen = sizeof(saddr);if (bind(sockfd, (struct sockaddr *)&saddr, addrlen) < 0){perror("bind失败");close(sockfd);return -1;}printf("bind成功\n");if (listen(sockfd, 7) < 0){perror("lisren失败");close(sockfd);return -1;}printf("listen成功\n");// 打开数据库if (sqlite3_open("./yuncidian.db", &db) < 0){printf("打开数据库失败: %s\n", sqlite3_errmsg(db));return -1;}FD_ZERO(&readfds);FD_ZERO(&tempfds);FD_SET(sockfd, &readfds);int max = sockfd;while (1){tempfds = readfds;int ret = select(max + 1, &tempfds, NULL, NULL, NULL);if (ret == -1){perror("select失败");close(sockfd);return -1;}if (FD_ISSET(sockfd, &tempfds)){int acceptfd = accept(sockfd, (struct sockaddr *)&caddr, &addrlen);if (acceptfd < 0){perror("accept失败\n");return -1;}printf("客户端ip:%s\t 端口号:%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));FD_SET(acceptfd, &readfds);if (max < acceptfd){max = acceptfd;}}for (int i = sockfd + 1; i <= max; i++){if (FD_ISSET(i, &tempfds)){int ret = recv(i, &msg, sizeof(msg), 0);msg.acceptfd = i;if (ret < 0){perror("recv失败");close(sockfd);return -1;}else if (ret == 0){printf("客户端acceptfd:%d退出\n", i);FD_CLR(i, &readfds);close(i);while (!FD_ISSET(max, &readfds)){max--;}}else{printf("%c\n", msg.type);switch (msg.type){case 'R':zhuce(&msg);break;case 'L':denglu(&msg);break;case 'Q':chaxun(&msg);break;case 'H':lishi(&msg);break;default:break;}}}}}return 0;
}void zhuce(MSG *msg) // 注册
{memset(msg->buf, 0, sizeof(msg->buf));char *errmsg = NULL;char sql[128];char check_sql[128];char **result = NULL;int rows, columns;while (1){ // 检查用户名是否已存在sprintf(check_sql, "select * from user where name='%s';", msg->name);if (sqlite3_get_table(db, check_sql, &result, &rows, &columns, &errmsg) != 0){sprintf(msg->buf, "查询失败: %s", errmsg);break;}if (rows > 0){sprintf(msg->buf, "用户名已存在");break;}// 执行插入操作sprintf(sql, "insert into user values('%s','%s');", msg->name, msg->password);if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "注册失败: %s", errmsg);break;}else{printf("%s\n", sql);sprintf(msg->buf, "注册成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void denglu(MSG *msg) // 登录
{memset(msg->buf, 0, sizeof(msg->buf));char sql[128];char *errmsg = NULL;char **result = NULL;int rows, columns;while (1){sprintf(sql, "select * from user where name = '%s' and password = '%s';", msg->name, msg->password);// 执行 SQL 查询int sqlget = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (sqlget != 0){sprintf(msg->buf, "sqlite3_get_table错误%s", errmsg);break;}else if (rows > 0){sprintf(msg->buf, "登录成功");break;}else{sprintf(msg->buf, "登录失败");break;}}send(msg->acceptfd, msg->buf, strlen(msg->buf), 0);
}
void chaxun(MSG *msg) // 查询
{memset(msg->buf, 0, sizeof(msg->buf));char sql[1024];char sql1[1024];char *errmsg = NULL;char **result = NULL;int rows, columns;time_t t;struct tm *timeinfo;char date[100];time(&t);timeinfo = localtime(&t);while (1){snprintf(date, sizeof(date), "%d-%d-%d %d:%d:%d", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);snprintf(sql, sizeof(sql), "select parse from dic where word='%s';", msg->msgg.word);snprintf(sql1, sizeof(sql1), "insert into history values ('%s','%s','%s');", msg->name, date, msg->msgg.word);if (sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "放入历史记录失败: %s", errmsg);break;}printf("%s\n", sql1);int rc = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (rc != 0){sprintf(msg->buf, "查询失败: %s", errmsg);}else{if (rows > 0){for (int i = 1; i <= rows; ++i){strcat(msg->buf, "查询到的单词信息:");strcat(msg->buf, result[i * columns]);strcat(msg->buf, "\n");}printf("%s\n", sql);break;}else{strcpy(msg->buf, "没有找到该单词信息.");break;}}}send(msg->acceptfd, msg->buf, strlen(msg->buf) - 1, 0);
}
void lishi(MSG *msg) // 历史
{printf("%s\n", msg->name);char sql[1100];char *errmsg = NULL;char **result = NULL;int rows, columns;while (1){sprintf(sql, "select date,word from history where name='%s';", msg->name);memset(msg->buf, 0, sizeof(msg->buf));int rc = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (rc != 0){sprintf(msg->buf, "查询历史记录失败: %s", errmsg);break;}else{if (rows > 0){for (int i = 1; i <= rows; ++i){strcat(msg->buf, "查询到的信息:");for (int j = 0; j < columns; ++j){strcat(msg->buf, result[i * columns + j]);strcat(msg->buf, " ");}strcat(msg->buf, "\n");}break;}else{strcpy(msg->buf, "该历史记录不存在");break;}}}send(msg->acceptfd, msg->buf, strlen(msg->buf) - 1, 0);
}

3.用户端

#include "head.h"int flag = 0;
fd_set readfds, tempfds;
sqlite3 *db;
MSG msg;void denglujiemian();    // 登录界面
void yuncidianjiemian(); // 云词典界面
void zhuce(MSG *msg);    // 注册
void denglu(MSG *msg);   // 登录
void chaxun(MSG *msg);   // 查询
void lishi(MSG *msg);    // 历史int main(int argc, char *argv[])
{if (argc != 2){printf("用法:<port>\n");return -1;}int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket err");return -1;}struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = inet_addr("192.168.50.214");socklen_t addrlen = sizeof(saddr);if (connect(sockfd, (struct sockaddr *)&saddr, addrlen) < 0){perror("connect err");return -1;}printf("connect 成功\n");while (1){memset(msg.buf, 0, sizeof(msg.buf));msg.acceptfd = sockfd;if (flag == 0){denglujiemian(); // 登录界面}if (flag == 1){yuncidianjiemian(); // 云词典界面}printf("请输入选项: ");scanf(" %c", &msg.type);printf("msg.type:%c\n", msg.type);switch (msg.type){case 'R':zhuce(&msg); // 注册break;case 'L':denglu(&msg); // 登录break;case 'Q':chaxun(&msg); // 查询break;case 'H':lishi(&msg); // 历史break;case 'D':flag = 0; // 返回登录菜单break;default:break;}}// 6.关闭close(sockfd);return 0;
}void denglujiemian() // 登录界面
{printf("************************************\n");printf("* R: register   L: login   D: quit *\n");printf("************************************\n");
}
void yuncidianjiemian() // 云词典界面
{printf("***********************************************\n");printf("* Q: query_word   H: history_record   D: quit *\n");printf("***********************************************\n");
}void zhuce(MSG *msg) // 注册
{memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void denglu(MSG *msg) // 登录
{while (1){memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "登录成功") == 0){flag = 1;break;}if (strcmp(msg->buf, "登录失败") == 0){continue;}}
}
void chaxun(MSG *msg) // 查询
{while (1){memset(msg->buf, 0, sizeof(msg->buf));memset(msg->msgg.word, 0, sizeof(msg->msgg.word));printf("请输入要查询的单词(输入#退出查询):");scanf("%s", msg->msgg.word);getchar();if (strcmp(msg->msgg.word, "#") == 0){break;}else{send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);continue;}}
}
void lishi(MSG *msg) // 历史
{send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}

 

相关文章:

网络编程项目(云词典项目)

目录 一、功能要求 服务器 用户客户端 二、演示效果 1.登录、注册功能 2. 查单词功能 3.查看历史纪录功能 三、项目代码 1.头文件 2.服务器 3.用户端 一、功能要求 仿照云词典的原理&#xff0c;实现云词典功能&#xff0c;用户可以查询输入的单词的英文解释&…...

Java Spring Boot 项目中的密码加密与验证开发案例手册

本手册主要针对Java项目中的账号密码加密与验证进行详细的步骤讲解和代码示例。适用于开发登录认证、用户管理等功能的场景。文档包含工具类的创建、数据库配置、服务层和控制器层的集成等常见操作。 1. 常用加密操作 在实现安全的登录功能时&#xff0c;密码加密与验证是不可…...

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示&#xff0c;本人在vue3typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码&#xff0c;发现typescript一直报 查询vuesax的目录文件发现存在ts文件&#xff0c;于是乎觉得是自己的问题&#xff0c;就查阅gpt与网上资料&#x…...

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…...

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…...

大数常用API

package API;public class BigNum {//如果普通的long和double的精度不足以满足要求&#xff0c;那么可以使用java.math包中的两个类//BigInteger和BigDecimal//前者实现任意精度的整数运算&#xff0c;后者实现任意精度的浮点数运算//BigInteger add(BigInteger other)//BigInt…...

Gartner发布ASCA自动化安全控制评估创新洞察:三年后40%的综合安全厂商都将提供ASCA功能

复杂的安全控制网络、技能差距和快速变化的攻击技术使维持技术安全控制的最佳配置的问题更加复杂。安全和风险管理领导者可以通过自动化安全控制评估来改善他们的安全状况。 主要发现 技术安全控制配置错误是与安全漏洞相关的长期问题。薄弱的安全默认值、配置漂移、为减少误报…...

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …...

php代码实例强制下载文件代码例子

php代码实例强制下载文件代码例子 $filename $_GET[file]; //Get the fileid from the URL // Query the file ID $query sprintf("SELECT * FROM tableName WHERE id %s",mysql_real_escape_string($filename)); $sql mysql_query($query); if(mysql_num_rows…...

Opencv中的直方图(3)直方图比较函数compareHist()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 比较两个直方图。 函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。 该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1​,H2​…...

压力测试(内存、磁盘、网络、cpu)

压力测试 1. 内存压力测试工具stressmemtester 2. 磁盘压力测试工具fio (Flexible I/O Tester)dd (Data Duplicator) 3. 网络压力测试工具iperf3speedtest-cli 4. CPU压力测试工具stress-ng 为了满足更详细的需求&#xff0c;以下是针对内存、磁盘和网络压力测试工具的更深入介…...

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果 核心代码完整代码&#xff1a;在线示例 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类&#xff0c;可以添加数据以及操作 FBO&#xff08;ManagedFBO&#xff09;&#…...

Java 设计模式-代理模式

目录 概述 一. 什么是代理模式 1. 举例说明 二. 代理模式作用 1. 保护代理 2. 增强功能 3. 代理交互 4. 远程代理&#xff1a; 三. 代理模式3个角色 四. 静态代理 1. 代码示例&#xff1a; 五. JDK动态代理 1. 代码示例&#xff1a; 六. CGLIB 动态代理 1.代码示…...

CTF靶场之BUUCTF介绍

最后开始关注CTF&#xff0c;我们先了解一下什么CTF:CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式,最后以夺取FLAG为成功。 从网上找了一个免费的靶场——BUUCTF&#xf…...

学会分析问题,画出分析图,解释问题过程,找出规律 ;整数数组分为左右2个部分,左边位奇数右边偶数

// 整数数组左边是奇数右边是偶数.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include<stdio.h> void swap(int& a,int& b) {int tempa;ab;btemp; } int main(int argc, char* argv[]) {int a[7]{1,2,3,4,5,…...

数学基础 -- 线性代数正交多项式之勒让德多项式展开推导

勒让德多项式展开的详细过程 勒让德多项式是一类在区间 [ − 1 , 1 ] [-1, 1] [−1,1] 上正交的多项式&#xff0c;可以用来逼近函数。我们可以将一个函数表示为勒让德多项式的线性组合。以下是如何推导勒让德多项式展开系数 a n a_n an​ 的详细过程。 1. 勒让德展开的基本…...

Redis实战宝典:从主从模式、哨兵模式、集群模式一步步理解Redis集群

目录标题 Redis 集群的三种模式主从复制主从复制概念主从复制原理主从复制优缺点 哨兵集群哨兵概念哨兵功能下线判断主库选举故障转移哨兵模式优缺点 Cluser 集群Redis 集群的数据分片 Redis 集群的三种模式 在生产环境中&#xff0c;我们使用 Redis 通常采用集群模式&#xf…...

828华为云征文|华为云Flexus X搭建借贷管理系统、二次开发借贷小程序 前端源码uniapp

在华为云828 B2B企业节的盛宴中&#xff0c;Flexus X实例以其卓越的算力性能和灵活的资源配置脱颖而出。对于追求极致性能、渴望在借贷管理、电商交易等场景中脱颖而出的您来说&#xff0c;Flexus X无疑是最佳拍档。搭载创新加速引擎&#xff0c;让您的自建MySQL、Redis、Nginx…...

网站安全需求分析与安全保护工程

网站安全威胁与需求分析 网站安全概念 网站&#xff1a;是基于B/S技术架构的综合信息服务平台&#xff0c;主要提供网页信息及业务后台对外接口服务。 网站安全性&#xff1a; 机密性&#xff1a;网站信息及相关数据不被授权查看或泄露完整性&#xff1a;网站信息及数据不能…...

后谷歌时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...