10.5作业

磕磕绊绊还是差不多完成了,tcp多客户端在线词典

代码:

数据库导入:有点粗糙,不知道怎么搞成两列,一个单词中间还是空格卧槽难搞

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{//词典数据库初始化sqlite3 *ppDb;if(sqlite3_open("../ele_directory.db",&ppDb)!=0){printf("__%d__:sqlite3_open error\n",__LINE__);return -1;}char sql[128]="create table if not exists directory (word char);";char *errmsg="";int sql_res=sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg);if(sql_res!=0){printf("__%d__:sqlite3_exec :%s\n",__LINE__,errmsg);return -1;}//导入数据FILE* fp=fopen("../dict.txt","r");if(NULL==fp){ERR_MSG("fopen");return -1;}while(1){char line[64]="";bzero(line,sizeof(line));char* fs_res=fgets(line,sizeof(line),fp);if(NULL==fs_res){puts("文件读取完毕");break;}bzero(sql,sizeof(sql));sprintf(sql,"insert into directory values(\"%s\");",line);sql_res=sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg);printf("%s\n",sql);if(sql_res!=0){printf("__%d__:sqlite3_exec:%s\n",__LINE__,errmsg);return -1;}}puts("数据导入完成");if(sqlite3_close(ppDb)!=0){printf("__%d__:sqlite3_close error\n",__LINE__);return -1;}return 0;
}

服务器:

server.c

/** function:    在线词典服务器TCP多线程* @param [ in] * @param [out] * @return      */
#include "head.h"int main(int argc, const char *argv[])
{//TCP服务器创建int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}//允许端口快速复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速复用成功\n");struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){ERR_MSG("bind");return -1;}printf("绑定成功\n");if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("监听状态\n");struct sockaddr_in cli_addr;socklen_t addrlen=sizeof(cli_addr);pthread_t pth;while(1){printf("客户端:%s:%d:连接前\n",\inet_ntoa(cli_addr.sin_addr),\ntohs(cli_addr.sin_addr.s_addr));int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&addrlen);if(cfd<0){ERR_MSG("accept");return -1;}printf("客户端:%s:%d:连接成功\n",\inet_ntoa(cli_addr.sin_addr),\ntohs(cli_addr.sin_port));//调用线程cli_info client;	client.cfd=cfd;client.cli_addr=cli_addr;if(pthread_create(&pth,NULL,fun,(void*)&client)<0){ERR_MSG("pthread_create");return -1;}printf("[%d]线程创建成功\n",cfd);pthread_detach(pth);//分离线程交由系统回收}close(sfd);return 0;
}

fun.c

#include "head.h"void * fun(void*arg){int cfd=((cli_info*)arg)->cfd;struct sockaddr_in cli_addr=((cli_info*)arg)->cli_addr;char buf[128]="";char user[16]="";//打开数据库sqlite3 *ppDb;if(sqlite3_open("../ele_directory.db",&ppDb)!=0){printf("__%d__:sqlite3_open error\n",__LINE__);return NULL;}//第一层//登录判断,(注册判断)1代表登录,2代表注册socklen_t addrlen=sizeof(cli_addr);	int recv_res=recv(cfd,&buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return NULL;}if(recv_res==0){printf("客户端:%s:%d:断开连接\n",\inet_ntoa(cli_addr.sin_addr),\ntohs(cli_addr.sin_port));return NULL;}printf("11111=%s\n",buf);if(buf[0]=='1'){//登录判断printf("login...\n");int login_res;while(login_res=isLogin(ppDb,cfd,&user)){printf("login_res=%d\n",login_res);char*l_res=NULL;if(1==login_res)l_res="1";else if(2==login_res)l_res="2";else if(3==login_res) l_res="3";elsereturn NULL;printf("l_res=%s\n",l_res);int send_res=send(cfd,l_res,sizeof(recv_res),0);if(send<0){ERR_MSG("send");return NULL;}}int send_res=send(cfd,"0",1,0);if(send<0){ERR_MSG("send");return NULL;}printf("%s登陆成功\n",user);}else if(buf[0]=='2'){//注册判断printf("register...\n");int register_res;while(register_res=isRegister(ppDb,cfd,&user)){printf("register_res=%d",register_res);if(register_res!=1)return NULL;}printf("%s注册成功\n",user);return NULL;}else{printf("__%d__unknown error\n",__LINE__);return NULL;}//第二层//单词查询或者记录查询或退出while(1){char sql[128]="";char* errmsg=NULL;bzero(buf,sizeof(buf));recv_res=recv(cfd,&buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return NULL;}if(recv_res==0){printf("客户端:%s:%d:断开连接\n",\inet_ntoa(cli_addr.sin_addr),\ntohs(cli_addr.sin_port));//账号状态设为未登录bzero(sql,sizeof(sql));sprintf(sql,"update account set status=\"1\" where account=\"%s\";",user);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);return NULL;}}if(buf[0]=='3'){//单词查询printf("word finding...\n");findWord(ppDb,cfd,user);	}else if(buf[0]=='4'){//记录查询printf("record finding...\n");findRecord(ppDb,cfd,user);}else if(buf[0]=='5'){printf("客户端:%s:退出登录\n",user);//账号状态设为未登录bzero(sql,sizeof(sql));sprintf(sql,"update account set status=\"1\" where account=\"%s\";",user);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);return NULL;}return NULL;}else{printf("__%d__unknown error\n",__LINE__);return NULL;}}//关闭数据库if(sqlite3_close(ppDb)!=0){printf("__%d__:sqlite3_close error\n",__LINE__);return NULL;}}
int isLogin(sqlite3 *ppDb,int cfd,char (*user)[]){char account[10]="";char password[10]="";char buf[128]="";//数据库查询,账号是否存在,若存在密码是否正确int recv_res=recv(cfd,&buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("客户端:%s:断开连接\n",*user);return -1;}printf("buf=%s\n",buf);sscanf(buf,"%s %s",account,password);char sql[128]="";char** pres = NULL;int row, column;char* errmsg = NULL;sprintf(sql,"select * from account where account=\"%s\";",account);if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("sql=%s\n",sql);int exist_res=0;//是否存在for (int i=0; i<(row+1)*column; i++){printf("%s\t", pres[i]);if((i+1)%column == 0)putchar('\n');exist_res=1;//存在为1}printf("exist_res=%d\n",exist_res);if(0==exist_res){printf("账号不存在\n");	return 1;//账号不存在返回1}else{printf("账号存在,判断密码\n");bzero(sql,sizeof(sql));sprintf(sql,"select status from account where account=\"%s\" and password=\"%s\";",account,password);if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("sql=%s\n",sql);int login_res=0;//是否存在账号密码匹配for (int i=column; i<(row+1)*column; i++){printf("%s\t", pres[i]);if((i+1)%column == 0)putchar('\n');login_res=1;//存在为1}if(0==login_res){printf("密码错误\n");return 2;//账号密码错误返回2}else if(0==strcmp(pres[column],"0")){printf("账号重复登录\n");return 3;}//账号状态设为已登录bzero(sql,sizeof(sql));sprintf(sql,"update account set status=\"0\" where account=\"%s\";",account);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);return -1;}printf("密码正确\n");strcpy(*user,account);return 0;//登陆成功返回0}
}
int isRegister(sqlite3 *ppDb,int cfd,char(*user)[]){char account[10]="";char password[10]="";char buf[128]="";//数据库查询,账号是否存在bzero(buf,sizeof(buf));int recv_res=recv(cfd,&buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("客户端:%s:断开连接\n",*user);return -1;}printf("buf=%s\n",buf);sscanf(buf,"%s %s",account,password);char sql[128]="";char** pres = NULL;int row, column;char* errmsg = NULL;sprintf(sql,"select * from account where account=\"%s\";",account);if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("sql=%s\n",sql);int reg_res=0;//是否存在for (int i=0; i<(row+1)*column; i++){printf("%s\t", pres[i]);if((i+1)%column == 0)putchar('\n');reg_res=1;//存在为1}printf("reg_res=%d\n",reg_res);if(0==reg_res){//不存在printf("账号不存在,开始注册:\n");	bzero(sql,sizeof(sql));sprintf(sql,"insert into account values (\"%s\",\"%s\",\"1\");",account,password);printf("sql=%s\n",sql);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("注册完成\n");strcpy(*user,account);char *r_res="0";//注册成功printf("r_res=%s\n",r_res);	int send_res=send(cfd,r_res,sizeof(recv_res),0);if(send<0){ERR_MSG("send");return -1;}return 0;}else{printf("账号已存在\n");char *r_res="1";printf("r_res=%s\n",r_res);	int send_res=send(cfd,r_res,sizeof(recv_res),0);if(send<0){ERR_MSG("send");return -1;}return 1;}}
int findWord(sqlite3 *ppDb,int cfd,char*user){printf("user=%s\n",user);char buf[128]="";char word[32]="";char sql[128]="";char*errmsg=NULL;int recv_res=recv(cfd,&word,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}if(recv_res==0){printf("客户端:%s:断开连接\n",user);//账号状态设为未登录sprintf(sql,"update account set status=\"1\" where account=\"%s\";",user);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);return -1;}}printf("word=%s\n",word);char** pres = NULL;int row, column;bzero(sql,sizeof(sql));sprintf(sql,"select * from directory where word like \"%s%\";",word);if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("sql=%s\n",sql);for (int i=column; i<(row+1)*column; i++){bzero(buf,sizeof(buf));printf("%s\t", pres[i]);strcpy(buf,pres[i]);strcat(buf," ");if((i+1)%column == 0)strcat(buf,"\n");printf("buf=%s\n",buf);int send_res=send(cfd,buf,sizeof(buf),0);if(send<0){ERR_MSG("send");return -1;}if((i+1)%column == 0)putchar('\n');}int send_res=send(cfd,"find over",strlen("find over"),0);if(send<0){ERR_MSG("send");return -1;}printf("查找完毕\n");//记录(word,time,user)bzero(sql,sizeof(sql));time_t t=time(NULL);struct tm *timeinfo=localtime(&t);char r_time[64]="";sprintf(r_time,"%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);printf("word:%s;time:%s;user:%s\n",word,r_time,user);printf("sql=%s\n",sql);sprintf(sql,"insert into record values(\"%s\",\"%s\",\"%s\");",word,r_time,user);printf("sql=%s\n",sql);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("记录完成\n");return 0;
}
int findRecord(sqlite3 *ppDb,int cfd,char*user){printf("user=%s\n",user);char sql[128]="";char** pres = NULL;int row, column;char* errmsg = NULL;char buf[128]="";sprintf(sql,"select * from record where user=\"%s\";",user);if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);return -1;}printf("sql=%s\n",sql);for (int i=column; i<(row+1)*column; i++){bzero(buf,sizeof(buf));printf("%s;%ld\t", pres[i],strlen(pres[i]));strcpy(buf,pres[i]);strcat(buf," ");if((i+1)%column == 0)strcat(buf,"\n");int send_res=send(cfd,buf,sizeof(buf),0);if(send<0){ERR_MSG("send");return -1;}if((i+1)%column == 0)putchar('\n');}printf("查找完毕\n");int send_res=send(cfd,"find record over",strlen("find record over"),0);if(send<0){ERR_MSG("send");return -1;}printf("记录查找完毕\n");return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.1.6"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>  
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
#include <sqlite3.h>
#include <time.h>typedef struct clientInfo{int cfd;struct sockaddr_in cli_addr;
}cli_info;void * fun(void*arg);
int isLogin(sqlite3 *ppDb,int cfd,char(*user)[]);
int isRegister(sqlite3 *ppDb,int cfd,char(*user)[]);
int findWord(sqlite3 *ppDb,int cfd,char*user);
int findRecord(sqlite3 *ppDb,int cfd,char*user);
#endif

客户端:

client.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>//自定义报错提示
#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.1.6"
/** function:    TCP客户端* @param [ in] * @param [out] * @return      */
int login(int cfd);
int registe(int cfd);
int findWord(int cfd);
int findRecord(int cfd);int main(int argc, const char *argv[])
{//1.创建socket套接字,int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd<0){ERR_MSG("socket");return -1;}puts("socket create");//允许端口快速复用int reuse = 1;if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速复用成功\n");//2.连接服务端connectstruct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(SER_PORT);addr.sin_addr.s_addr=inet_addr(SER_IP);if(connect(cfd,(struct sockaddr*)&addr,sizeof(addr))<0){ERR_MSG("connect");return -1;}puts("connect success");printf("-------------------------------------------------\n");printf("-------Wecome to eletronic directory system------\n");printf("-------------------------------------------------\n");printf("--------------1.登录-----------------------------\n");printf("--------------2.注册-----------------------------\n");printf("--------------3.退出-----------------------------\n");printf("-------------------------------------------------\n");printf("-------------------------------------------------\n");printf("-------------------------------------------------\n");char choice=0;while(1){printf("请选择1.登录;2注册;3.退出>>>");choice=getchar();while(getchar()!='\n');switch(choice){case '1'://登录if(5==login(cfd))return 0;break;case '2'://注册if(0==registe(cfd))return 0;case '3'://退出return 0;default :printf("错误输入,请重输\n");break;	}}close(cfd);return 0;
}
int login(int cfd){char buf[32]="";char status=0;int send_res=send(cfd,"1",1,0);if(send_res<0){ERR_MSG("send");return -1;}while(1){printf("请输入账号 密码 (空格分开)>>>");fgets(buf,sizeof(buf),stdin);int send_res=send(cfd,buf,sizeof(buf),0);if(send_res<0){ERR_MSG("send");return -1;}int recv_res=recv(cfd,&status,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("socket peer has shutdown\n");return -2;}printf("status=%c\n",status);if('1'==status){printf("账号不存在\n");}else if('2'==status){printf("密码错误\n");}else if('3'==status){printf("账号已登录\n");}else{printf("登陆成功\n");break;}}printf("-----------------------------------\n");printf("-------请输入你的操作--------------\n");printf("---------3.查找单词----------------\n");printf("---------4.记录查询----------------\n");printf("---------5.退出--------------------\n");printf("-----------------------------------\n");char choice=0;while(1){printf("请选择>>>3.查找单词4.记录查询5.退出");choice=getchar();while(getchar()!='\n');switch(choice){case '3'://查找单词findWord(cfd);break;case '4'://查询记录findRecord(cfd);break;case '5'://退出send_res=send(cfd,"5",1,0);if(send_res<0){ERR_MSG("send");return -1;}return 5;default :printf("错误输入,请重输\n");break;	}}return 0;
}
int registe(int cfd){char buf[32]="";char status=0;int send_res=send(cfd,"2",1,0);if(send_res<0){ERR_MSG("send");return -1;}while(1){bzero(buf,sizeof(buf));printf("请输入账号 密码 (空格分开)>>>");fgets(buf,sizeof(buf),stdin);printf("%s",buf);int send_res=send(cfd,buf,sizeof(buf),0);if(send_res<0){ERR_MSG("send");return -1;}int recv_res=recv(cfd,&status,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("socket peer has shutdown\n");return -2;}printf("status=%c\n",status);if(status=='0'){printf("注册成功,请重新进入系统\n");return 0;}else if(status=='1'){printf("账号已存在\n");}}
}
int findWord(int cfd){char buf[128]="";int send_res=send(cfd,"3",1,0);if(send_res<0){ERR_MSG("send");return -1;}printf("请输入你要查询的单词(支持模糊查询)>>>");fgets(buf,sizeof(buf),stdin);printf("%s",buf);buf[strlen(buf)-1] = '\0';send_res=send(cfd,buf,sizeof(buf),0);if(send_res<0){ERR_MSG("send");return -1;}while(1){bzero(buf,sizeof(buf));int recv_res=recv(cfd,buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("socket peer has shutdown\n");return -2;}if(0==strcmp(buf,"find over"))break;printf("%s\n",buf);}putchar(10);printf("查找单词完毕\n");return 0;
}
int findRecord(int cfd){char buf[128]="";int send_res=send(cfd,"4",1,0);if(send_res<0){ERR_MSG("send");return -1;}while(1){bzero(buf,sizeof(buf));int recv_res=recv(cfd,buf,sizeof(buf),0);if(recv_res<0){ERR_MSG("recv");return -1;}else if(recv_res==0){printf("socket peer has shutdown\n");return -2;}if(0==strcmp(buf,"find record over"))break;printf("%s",buf);}putchar(10);printf("查找记录完毕\n");return 0;
}

又是依托屎山代码,好乱,不想去整理了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148228.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 代码中的文档和注释

撰写清晰、简洁和全面的代码文档的指南 在软件开发领域&#xff0c;编写代码只占了一半的战斗。另一半则围绕着创建清晰、简洁和全面的文档展开&#xff0c;这些文档不仅有助于开发人员理解代码库&#xff0c;还充当未来开发的路线图。在本指南中&#xff0c;我们将深入探讨编…

Spring:通过@Lazy解决构造方法形式的循环依赖问题

一、定义2个循环依赖的类 package cn.edu.tju.domain2;import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component;Component public class A {private final B b;public B getB() {return b;}Lazypublic A(B b){this.b b;//Sy…

[React源码解析] React的设计理念和源码架构 (一)

任务分割异步执行让出执法权 文章目录 1.React的设计理念1.1 Fiber1.2 Scheduler1.3 Lane1.4 代数效应 2.React的源码架构2.1 大概图示2.2 jsx2.3 Fiber双缓存2.4 scheduler2.5 Lane模型2.6 reconciler2.7 renderer2.8 concurrent 3.React源码调试 1.React的设计理念 Fiber: 即…

python获取时间戳

使用 datetime 库获取时间。 获取当前时间&#xff1a; import datetime print(datetime.datetime.now()) . 后面的是微秒&#xff0c;也是一个时间单位&#xff0c;1秒1000000微秒。 转为时间戳&#xff1a; import datetimedate datetime.datetime.now() timestamp date…

最短路径专题5 最短路径

题目&#xff1a; 样例&#xff1a; 输入 4 5 0 2 0 1 2 0 2 5 0 3 1 1 2 2 3 2 2 输出 3 0->3->2 思路&#xff1a; 根据题目意思&#xff0c;求最短路&#xff0c;这个根据平时的Dijkstra&#xff08;堆优化&#xff09;即可&#xff0c;关键在于求路径的方法&#x…

uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)

效果 代码 <template><view><!-- 车搭配指示器-双显 --><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class…

视频讲解|含可再生能源的热电联供型微网经济运行优化(含确定性和源荷随机两部分代码)

1 主要内容 该视频为《含可再生能源的热电联供型微网经济运行优化》代码讲解内容&#xff0c;对应的资源下载链接为考虑源荷不确定性的热电联供微网优化-王锐matlab&#xff08;含视频讲解&#xff09;&#xff0c;对该程序进行了详尽的讲解&#xff0c;基本做到句句分析和讲解…

源码系列 之 ThreadLocal

简介 ThreadLocal的作用是做数据隔离&#xff0c;存储的变量只属于当前线程&#xff0c;相当于当前线程的局部变量&#xff0c;多线程环境下&#xff0c;不会被别的线程访问与修改。常用于存储线程私有成员变量、上下文&#xff0c;和用于同一线程&#xff0c;不同层级方法间传…

【数据结构】链表与LinkedList

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

Ubuntu中启动HDFS后没有NameNode解决办法

关闭进程&#xff1a; stop-dfs.sh 格式化&#xff1a; hadoop namenode -format 出现报错信息&#xff1a; 23/10/03 22:27:04 WARN fs.FileUtil: Failed to delete file or dir [/usr/data/hadoop/tmp/dfs/name/current/fsimage_0000000000000000000.md5]: it still exi…

3种等待方式,让你学会Selenium设置自动化等待测试脚本!

一、Selenium脚本为什么要设置等待方式&#xff1f;——即他的应用背景到底是什么 应用Selenium时&#xff0c;浏览器加载过程中无法立即显示对应的页面元素从而无法进行元素操作&#xff0c;需设置一定的等待时间去等待元素的出现。&#xff08;简单来说&#xff0c;就是设置…

黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)

参考文章1&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2&#xff1a;https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇数据库相关概念&#xff08;数据库DataBase&#xff08;DB&#xff09;、数据库管理系统DataBase Management Sy…

正则表达式基本使用

文章目录 1. 基本介绍2. 元字符(Metacharacter)-转义号 \\3. 元字符-字符匹配符3.1 案例 4. 元字符-选择匹配符5. 元字符-限定符6. 元字符-定位符7. 分组7.1 捕获分组7.2 非捕获分组 8. 非贪婪匹配9. 应用实例10. 正则验证复杂URL 1. 基本介绍 如果要想灵活的运用正则表达式&a…

【算法学习】-【双指针】-【快乐数】

LeetCode原题链接&#xff1a;202. 快乐数 下面是题目描述&#xff1a; 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果…

Linux:minishell

目录 1.实现逻辑 2.代码及效果展示 1.打印字符串提示用户输入指令 2.父进程拆解指令 3.子进程执行指令,父进程等待结果 4.效果 3.实现过程中遇到的问题 1.打印字符串的时候不显示 2.多换了一行 3.cd路径无效 4.优化 1.ll指令 2.给文件或目录加上颜色 代码链接 模…

Redis相关概念

1. 什么是Redis&#xff1f;它主要用来什么的&#xff1f; Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提…

IDT 一款自动化挖掘未授权访问漏洞的信息收集工具

IDT v1.0 IDT 意为 Interface detection&#xff08;接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测&#xff0c;支持浏览器自动打开指定的url&#xff0c;避免手动重复打开网址。只需输入存在批量的url文件即可。 …

SpringBoot快速入门

搭建SpringBoot工程&#xff0c;定义hello方法&#xff0c;返回“Hello SpringBoot” ②导入springboot工程需要继承的父工程&#xff1b;以及web开发的起步依赖。 ③编写Controller ④引导类就是SpringBoot项目的一个入口。 写注解写main方法调用run方法 快速构建SpringBoo…

动态规划-状态机(188. 买卖股票的最佳时机 IV)

状态分类&#xff1a; f[i,j,0]考虑前i只股票&#xff0c;进行了j笔交易&#xff0c;目前未持有股票 所能获得最大利润 f[i,j,1]考虑前i只股票&#xff0c;进行了j笔交易&#xff0c;目前持有股票 所能获得最大利润 状态转移&#xff1a; f[i][j][0] Math.max(f[i-1][j][0],f[…

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等&#xff0c;本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等&#xff0c;欢迎持续关注我们哦~ Dev…