词典项目练习

news2024/11/17 13:54:29

 思维导图

 客户端

#include "head.h"
//用户提示界面
void help_info1()
{
	printf("\t-----------------------------------------------\n");
	printf("\t|               HENRY   在线辞典               |\n");
	printf("\t|版本:0.0.1                                    |\n");
	printf("\t|作者:Demons457                                |\n");
	printf("\t|功能:                                         |\n");
	printf("\t|    [1] 登录                                  |\n");
	printf("\t|    [2] 注册                                  |\n");
	printf("\t|    [3] 退出                                  |\n");
	printf("\t|注意:用户只有登录成功后才能进入查单词界面     |\n");
	printf("\t------------------------------------------------\n");
	return;
}
void help_info2()
{
	printf("\t-----------------------------------------------\n");
	printf("\t|     欢迎进入单词查询系统,很高兴为您服务     |\n");
	printf("\t|版本:0.0.1                                    |\n");
	printf("\t|作者:Demons457                                |\n");
	printf("\t|功能:                                         |\n");
	printf("\t|    [1] 查单词                                |\n");
	printf("\t|    [2] 查询历史记录                          |\n");
	printf("\t|    [3] 退出查询系统                          |\n");
	printf("\t|注意:用户只有登录成功后才能进入查单词界面     |\n");
	printf("\t------------------------------------------------\n");
	return;
}
 
 
//用户输入指令
enum{
	LOGIN    = 1,  //登陆
	REGISTER = 2,  //注册
	QUIT     = 3,  //退出
	QUERY    = 1,  //查询单词
	HISTORY  = 2,  //查询历史
};
 
int init_tcp(char *ip,char *port)
{
	int sockfd;
	struct sockaddr_in server_addr;
 
	if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		perror("Fail to socket");	
		exit(EXIT_FAILURE);
	}
 
	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(atoi(port));
	server_addr.sin_addr.s_addr = inet_addr(ip);
 
	if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)
	{
		perror("Fail to bind");	
		exit(EXIT_FAILURE);
	}
 
	return sockfd;
}
 
int do_register(int sockfd)
{
	int n = 0;
	int count = 0;
	char buf[1024] = {0};
	//定义发送的协议头
	mhead_t *head = (mhead_t *)buf;
 
	printf("\n您正在注册,请输入用户名和密码\n");
 
	head->type = USER_REGISTER;
	head->size = sizeof(mhead_t);
 
	printf("Input username : ");
	fgets(head->username,sizeof(head->username),stdin);
	head->username[strlen(head->username) - 1] = '\0';
 
	printf("Input password : ");
	fgets(head->password,sizeof(head->password),stdin);
	head->password[strlen(head->password) - 1] = '\0';
 
	//发给服务器端
	
	if(send(sockfd,buf,sizeof(mhead_t),0) < 0)
	{
		perror("Fail to send");
		exit(EXIT_FAILURE);
	}
	
	bzero(&buf,sizeof(buf));
	while(1)
	{
		//接收数据,TCP是可靠的连接,若是数据
		//未完全接收的话,可以在接收
		n = recv(sockfd,buf + count,sizeof(mhead_t) - count,0);
 
		if(n <= 0){
			perror("Fail to send");
			exit(EXIT_FAILURE);
		}
		//若是数据未发送完成,再次接收的时候可补充
		count += n;
		if(count == sizeof(mhead_t))
			break;
	}
 
	if(head->type == USER_SUCCESS)
	{
		printf("\n恭喜您,注册成功!\n");	
		return 0;
	}else{
		printf("\n很遗憾,这个用户名已经被其它用户注册过了,请重新注册");	
		return -1;
	}
 
}
int do_query(int sockfd)
{
	int n = 0;
	int fd;
	int count = 0;
	char buf[1024] = {0};
	char buf1[128]={0};
	char buf2[128]={0};
	char buf3[]="\n";
	fd=open("/home/linux/22061/2/client/history.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
	if(fd<0)
	{
	 perror("Fail to open");
	 return -1;
	}
	//定义发送的协议头
	mhead_t *head = (mhead_t *)buf;
 
	printf("\n您正在查询单词\n");
 
	head->type = USER_WORD;
	head->size = sizeof(mhead_t);
 
	printf("pelse input word : ");
	fgets(head->word,sizeof(head->word),stdin);
	head->word[strlen(head->word) - 1] = '\0';
    strcpy(buf1,head->word);
	if(send(sockfd,buf,sizeof(mhead_t),0) < 0)
	{
		perror("Fail to send");
		exit(EXIT_FAILURE);
	}
	
	bzero(&buf,sizeof(buf));
	while(1)
	{
		//接收数据
		//未完全接收的话,可以在接收
		n = recv(sockfd,buf + count,sizeof(mhead_t) - count,0);
 
		if(n <= 0){
			perror("Fail to send");
			exit(EXIT_FAILURE);
		}
		//若是数据未发送完成,再次接收的时候可补充
		count += n;
		if(count == sizeof(mhead_t))
			break;
	}
  //把服务器返回的信息打印出来
 	if(head->type == USER_SUCCESS)
	{
		printf(" word:%s\n",head->word);	
		time_t t;
		time(&t);
		sprintf(buf2,"\n%s\n",ctime(&t));
		write(fd,buf1,strlen(buf1));
		write(fd,buf2,strlen(buf2));
		write(fd,head->word,strlen(head->word));
		write(fd,buf3,strlen(buf3));
		close(fd);
		return 0;
	}else{
		printf("\n很遗憾,没有此单词,请重新输入\n");	
		return -1;
	}
   
}
int do_history(int sockfd)
{
  int fd,n;
  char buf[1024]={0};
  fd=open("/home/linux/22061/2/client/history.txt",O_RDONLY);
  if(fd<0)
  {
   perror("Fail to open");
   return -1;
  }
  while(1)
  {
   n=read(fd,buf,sizeof(buf));
   if(0==n)
	   break;
   puts(buf);
  }
  return 0;
}
int do_task2(int sockfd)
{
	int cmd;
	while(1)
	{
		//提示界面帮助,用户选择
		help_info2();	
 
		printf("\n\n请选择>");
		scanf("%d",&cmd);
		//吃掉回车键
		getchar();
		switch(cmd)
		{
			//用户查询单词
			case QUERY:
				if(do_query(sockfd) < 0)
					continue;
					break;
			//用户登陆
			case HISTORY:
					if(do_history(sockfd)<0)
					continue;
					 break;
			case QUIT:
				exit(EXIT_SUCCESS);
			default:
				printf("Unknow cmd.\n");
				continue;
		}
	}
	return 0;
}
 
int do_login(int sockfd)
{
	int n = 0;
	int count = 0;
	char buf[1024] = {0};
	//定义发送的协议头
	mhead_t *head = (mhead_t *)buf;
 
	printf("\n您正在登陆,请输入用户名和密码\n");
 
	head->type = USER_LOGIN;
	head->size = sizeof(mhead_t);
 
	printf("Input username : ");
	fgets(head->username,sizeof(head->username),stdin);
	head->username[strlen(head->username) - 1] = '\0';
 
	printf("Input password : ");
	fgets(head->password,sizeof(head->password),stdin);
	head->password[strlen(head->password) - 1] = '\0';
 
	//发给服务器端
	
	if(send(sockfd,buf,sizeof(mhead_t),0) < 0)
	{
		perror("Fail to send");
		exit(EXIT_FAILURE);
	}
	
	bzero(&buf,sizeof(buf));
	while(1)
	{
		//接收数据
		//未完全接收的话
		n = recv(sockfd,buf + count,sizeof(mhead_t) - count,0);
 
		if(n <= 0){
			perror("Fail to send");
			exit(EXIT_FAILURE);
		}
		//若是数据未发送完成,再次接收的时候可补充
		count += n;
		if(count == sizeof(mhead_t))
			break;
	}
 
	if(head->type == USER_SUCCESS)
	{
		printf("\n恭喜您,登陆成功!\n");	
		do_task2(sockfd);
		return 0;
	}else{
		printf("\n很遗憾,您的帐号或密码错误,请重新输入");	
		return -1;
	}
   
 
}
int do_task(int sockfd)
{
	int cmd;
	while(1)
	{
		//提示界面帮助,用户选择
		help_info1();	
 
		printf("\n\n请选择>");
		scanf("%d",&cmd);
		//吃掉回车键
		getchar();
		switch(cmd)
		{
			//用户注册
			case REGISTER:
				if(do_register(sockfd) < 0)
					continue;
					break;
			//用户登陆
			case LOGIN:
					if(do_login(sockfd)<0)
					continue;
					 break;
			case QUIT:
				exit(EXIT_SUCCESS);
			default:
				printf("Unknow cmd.\n");
				continue;
		}
	}
	return 0;
}
 
//由于后面要传递参数
int main(int argc, char *argv[])
{
	int sockfd;	
	int addr_len = sizeof(struct sockaddr);
	struct sockaddr_in peer_addr;
 
	if(argc < 3)
	{
		fprintf(stderr,"Usage : %s argv[1] argv[2]\n",argv[0]);	
		exit(EXIT_FAILURE);
	}
 
	sockfd = init_tcp(argv[1],argv[2]);
 
	do_task(sockfd);
 
	return 0;
}

服务器端

#include "head.h"
 
 
void signal_handler(int signum)
{
	waitpid(-1,NULL,WNOHANG);
	return;
}
int init_tcp(char *ip,char *port)
{
	int sockfd;
	struct sockaddr_in server_addr;
 
	if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		perror("Fail to socket");
		exit(EXIT_FAILURE);
	}
	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port   = htons(atoi(port));
	server_addr.sin_addr.s_addr = inet_addr(ip);
 
	if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)
	{
		perror("Fail to bind");
		exit(EXIT_FAILURE);
	}
	
	listen(sockfd,5);
	printf("listen....\n");
	return sockfd;
}
 
//数据库中手动创建2个表:user_table,word_table
int main(int argc, char *argv[])
{
	int pid;	
	sqlite3 *pdb;
	int listenfd,connect_fd;
	int addr_len = sizeof(struct sockaddr);
	struct sockaddr_in peer_addr;
 
	if(argc < 4)
	{
		fprintf(stderr,"Usage : %s ip port system.db.\n",argv[0]);
		exit(EXIT_FAILURE);
	}
 
	//探测子进程的改变状态,回收僵尸态子进程
	if(signal(SIGCHLD,signal_handler) == SIG_ERR)
	{
		perror("Fail to signal");
		exit(EXIT_FAILURE);
	}
 
	if(sqlite3_open(argv[3],&pdb) != SQLITE_OK)
	{
		fprintf(stderr,"sqlite3 open %s : %s.\n",argv[3],sqlite3_errmsg(pdb));
		exit(EXIT_FAILURE);
	}
 
	//初始化tcp连接,得到监听套接字
	listenfd = init_tcp(argv[1],argv[2]);
 
	//提取客户段的链接请求,创建子进程和客户端交互
	while(1)
	{
		if((connect_fd = accept(listenfd,(struct sockaddr *)&peer_addr,&addr_len)) < 0)
		{
			perror("Fail to accept");
			exit(EXIT_FAILURE);
		}
		
		if((pid = fork()) < 0)
		{
			perror("Fail to fork");
			exit(EXIT_FAILURE);
		}
 
		//创建子进程处理客户端的请求
		if(pid == 0){
			close(listenfd);
			do_client(connect_fd,pdb);
		}
		close(connect_fd);
	}
 
	exit(EXIT_SUCCESS);
}
#include "head.h" 
 
int do_register(int sockfd,sqlite3 *pdb,char *_username,char *_password)
{
	char *errmsg;
	char buf[1024];
	char **dbresult;
	int nrow = 0,ncolumn = 0;
	char sql[1024] = {0};
	mhead_t *head = (mhead_t *)buf;	
 
	sprintf(sql,"select * from user_table where NAME='%s';",_username);
	if(sqlite3_get_table(pdb,sql,&dbresult,&nrow,&ncolumn,&errmsg) != 0)
	{
		fprintf(stderr,"sqlite3 get table error : %s.\n",errmsg);
		exit(EXIT_FAILURE);
	}
 
	//没有这样的用户名
	if(nrow == 0)
	{
		//录入数据库
		bzero(sql,sizeof(sql));
		sprintf(sql,"insert into user_table values('%s','%s');",_username,_password);
		EXEC_SQL(pdb,sql,errmsg);
		
		printf("ok ........\n");
 
		head->type = USER_SUCCESS;
		if(send(sockfd,buf,sizeof(mhead_t),0) < 0)
		{
			perror("Fail to send");
			exit(EXIT_FAILURE);
		}
	//注册失败,用户名存在
	}else{
		head->type = USER_FAILURE;
		if(send(sockfd,buf,sizeof(mhead_t),0) < 0)
		{
			perror("Fail to send");
			exit(EXIT_FAILURE);
		}
		//表示未知
		printf("???????\n");
	}
	//插入到数据库之后,释放dbresult结果
	sqlite3_free_table(dbresult);
	return 0;
}
 
int do_login(int sockfd,sqlite3 *pdb,char *_username,char *_password)
{  
	char *errmsg;
	int i,j;
	char buf[1024];
	char **dbresult;
	int nrow = 0,ncolumn = 0;
	char sql[1024] = {0};
	mhead_t *head = (mhead_t *)buf;	
	char *zsql="select * from user_table";
	int index=0;
    //查找数据库中是否有该帐号
   //	sprintf(sql,"select * from user_table where NAME='%s';",_username);
	if(sqlite3_get_table(pdb,zsql,&dbresult,&nrow,&ncolumn,&errmsg) != 0)
	{
		fprintf(stderr,"sqlite3 get table error : %s.\n",errmsg);
		exit(EXIT_FAILURE);
	}
	//登陆
	for(i=0;i<=nrow;i++)
	{
	 for(j=0;j<ncolumn;j++)
	 {
	  if(strcmp(dbresult[index],_username)==0&&strcmp(dbresult[index+1],_password)==0)
	  {
	   printf("登陆成功\n");
	   head->type=USER_SUCCESS;
	   printf("%d\n",head->type);
	   if(send(sockfd,buf,sizeof(mhead_t),0)<0)
	   {
	    perror("Fail to send");
		exit(EXIT_FAILURE);
	   }
	   sqlite3_free_table(dbresult);
	   return 0;
	  }
	 }
	 index++;
	}
	//帐号密码错误
	head->type=USER_FAILURE;
	if(send(sockfd,buf,sizeof(mhead_t),0)<0)
	{
	   perror("Fail to send");
	   exit(EXIT_FAILURE);
	}
	printf("??????\n");
	sqlite3_free_table(dbresult);
	return 0;
}
int do_word(int sockfd,sqlite3 *pdb,char *_word)
{
	char *errmsg;
	int i,j;
	char buf[1024];
	char **dbresult;
	int nrow = 0,ncolumn = 0;
	char sql[1024] = {0};
	char *zsql="select * from dict_table";
	int index;
	mhead_t *head = (mhead_t *)buf;	
    //查找数据库中是否有该单词
	//sprintf(sql,"select * from dict_table where word='%s';",_word);
	if(sqlite3_get_table(pdb,zsql,&dbresult,&nrow,&ncolumn,&errmsg) != 0)
	{
		fprintf(stderr,"sqlite3 get table error : %s.\n",errmsg);
		exit(EXIT_FAILURE);
	}
    for(i=0;i<=nrow;i++)
	{
	  for(j=0;j<ncolumn;j++)
	  {
	   if(strcmp(dbresult[index],_word)==0)
	   {
	    //查单词
		printf("ok\n");
		head->type=USER_SUCCESS;
		strcpy(head->word,dbresult[index+1]);
		if(send(sockfd,buf,sizeof(mhead_t),0)<0)
		{
			perror("Fail to send");
			exit(EXIT_FAILURE);
		}
		printf("%d\n",index);
		sqlite3_free_table(dbresult);
		return 0;
	   }
	   index++;
	  }
	}
	//查找失败,没有该单词
	head->type=USER_FAILURE;
	if(send(sockfd,buf,sizeof(mhead_t),0)<0)
	{
	  perror("Fail to send");
	  exit(EXIT_FAILURE);
	}
	printf("?????\n");
	sqlite3_free_table(dbresult);
	return 0;
}
int do_client(int sockfd,sqlite3 *pdb)
{
	int n;
	int count = 0;
	char buf[1024];
	mhead_t *head = (mhead_t *)buf;	
 
	while(1)
	{
		count = 0;
		//接收协议头
		while(1)
		{
			n = recv(sockfd,buf + count,sizeof(mhead_t) - count,0);
			if(n <= 0){
				exit(EXIT_FAILURE);
			}
 
			count += n;
			printf("count : %d mhead_t : %ld\n",count,sizeof(mhead_t));
			if(count == sizeof(mhead_t))
				break;
		}
 
		switch(head->type)
		{
		case USER_REGISTER:
			do_register(sockfd,pdb,head->username,head->password);	
			break;
		
		case USER_LOGIN:
			do_login(sockfd,pdb,head->username,head->password);
			break;
		case USER_WORD:
			do_word(sockfd,pdb,head->word);
			break;
		defalut:
			exit(EXIT_SUCCESS);
		}	
	}
 
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

官方实锤!AMD真的已经有了大小核:不搞Intel那一套

Intel 12代酷睿开始引入大小核混合架构&#xff0c;多核跑分提升立竿见影&#xff0c;在游戏、渲染等场景中也有很好的辅助作用&#xff0c;但因为大核心、小核心基于完全不同的架构&#xff0c;需要复杂的系统、软件调度配合&#xff0c;也直接导致失去了AVX-512指令集。 AMD也…

解决多线程环境下单例模式同时访问生成多个实例

如何满足单例&#xff1a;1.构造方法是private、static方法、if语句判断 ①、单线程 Single类 //Single类&#xff0c;定义一个GetInstance操作&#xff0c;允许客户访问它的唯一实例。GetInstance是一个静态方法&#xff0c;主要负责创建自己的唯一实例 public class LazySi…

浅析hooks,复杂前端业务解题之道

hooks 大势所趋 2019年年初&#xff0c;react 在 16.8.x 版本正式具备了 hooks 能力&#xff0c;同年6月&#xff1b;尤雨溪在 vue/github-issues 里提出了关于 vue3 Component API 的提案&#xff08;vue hooks的基础&#xff09;。在Vue3的组合式API出现后&#xff0c;githu…

VS2017配置Qt开发环境

VS2017配置Qt开发环境 安装Qt5.12.11安装Qt插件在VS2017中进行设置参考教程 安装Qt5.12.11 安装Qt插件 在VS2017中进行设置 参考教程 # Qt下载地址 https://download.qt.io/ # Qt安装 https://blog.csdn.net/jjxcsdn/article/details/125432165?spm1001.2014.3001.5506 # VS2…

【LeetCode】解码方法(动态规划)

解码方法 题目描述算法流程编程代码代码优化 链接: 解码方法 题目描述 算法流程 编程代码 class Solution { public:int numDecodings(string s) {int n s.size();vector<int> dp(n);dp[0] s[0] ! 0;if(n 1) return dp[0];if(s[1] < 9 && s[1] > 1) d…

Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。

Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 192.168.2.1 255.255.255.0 不适用 R2 G0/0 192.168.2.2 255.255.255.0 不适用 S1 VLAN 1 192.168.2.3 255.255.255.0 192.168.2.1 TFTP …

Neo4j文档阅读笔记-Installation and Launch Guide

安装&#xff08;Windows&#xff09; ①找到下载好的Neo4j Desktop文件&#xff0c;然后双击进行安装&#xff1b; ②安装Neo4j Desktop根据下一步进行安装。 启动 ①激活 打开Neo4j Desktop应用程序后&#xff0c;将激活码输入到“Activation Key”窗口中。 ②创建数据库…

牛客网Verilog刷题——VL44

牛客网Verilog刷题——VL44 题目题目解析答案 题目 如图所示为两种状态机中的一种&#xff0c;请根据状态转移图写出代码&#xff0c;状态转移线上的0/0等表示的意思是过程中data/flag的值。 要求&#xff1a; 1、 必须使用对应类型的状态机 2、 使用二段式描述方法 注意rs…

远程医疗技术的变革

目录 1.远程医疗的概念 2.远程医疗的发展历史 3.远程医疗的靠谱性 4.远程医疗的潜在危害 1.远程医疗的概念 远程医疗是一种通过通信技术&#xff0c;使医生和患者能够在不同地点进行医疗咨询和治疗的形式。它利用视频通话、电话、在线聊天和其他远程通信工具来实现远程诊断…

自定义一个仿拼多多地址选择器

前言 做了一个仿拼多多的地址选择器&#xff0c;但是与拼多多实现方法有些出入&#xff0c;大体效果是差不多的。废话不多说&#xff0c;先上一张效果动图&#xff1a; 开始 先说说本文的一些概念。地区级别&#xff1a;就是比如省级&#xff0c;市级&#xff0c;县级&#x…

理解复杂系统的关键:耐心

理解复杂系统的关键&#xff1a;耐心 复杂系统本质上是多面的、复杂的。它们通常并非被设计成一瞬间就能理解的。这对于自然发生的系统&#xff0c;如生态系统&#xff0c;和人类设计的系统&#xff0c;如高级软件或机械&#xff0c;都是适用的。这些系统是由多个组件混合而成…

【腾讯云Cloud Studio实战训练营】使用Cloud Studio迅捷开发一个3D家具个性化定制应用

目录 前言&#xff1a; 一、腾讯云 Cloud Studio介绍&#xff1a; 1、接近本地 IDE 的开发体验 2、多环境可选&#xff0c;或连接到云主机 3、随时分享预览效果 4、兼容 VSCode 插件 5、 AI代码助手 二、腾讯云Cloud Studio项目实践&#xff08;3D家具个性化定制应用&…

牛客网Verilog刷题——VL42

牛客网Verilog刷题——VL42 题目答案 题目 请设计一个可以实现任意小数分频的时钟分频器&#xff0c;比如说8.7分频的时钟信号&#xff0c;注意rst为低电平复位。提示&#xff1a;其实本质上是一个简单的数学问题&#xff0c;即如何使用最小公倍数得到时钟周期的分别频比。设小…

一夜卷走220万美元

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在「刘教链内参」发表了《内参&#xff1a;对传国内某DAO组织被刑事立案一事的分析》&#xff0c;欢迎关注公众号「刘教链内参」并阅读。 --- 隔夜比特币继续在29k上方盘旋。 表面的百无聊赖之下&#xff0c;各种土狗…

隐私保护之隐私信息检索

【引子】用户的隐私保护涉及多个方面&#xff0c;用户行为的隐私保护更是一个难点。周末读了一篇论文&#xff0c;https://cacm.acm.org/magazines/2010/4/81501-private-information-retrieval/fulltext&#xff0c;涉及了很多数学上的方法和概念&#xff0c;很是费劲&#xf…

Python--matplotlib基础绘图

前言 本章来说一下绘图&#xff0c;毕竟在软硬件行业&#xff0c;设备端的日志有了&#xff0c;前面也讲了抽取数据&#xff0c;怎么能不绘图呢。 在工作中&#xff0c;我也是经常会遇到研发有这样的需求&#xff0c;把数据整理出来&#xff0c;做成图&#xff0c;便于分析BUG。…

类变量和类方法

类变量和类方法 引入 思考&#xff1a;有一群小孩在玩堆雪人&#xff0c;不时有新的小孩加入&#xff0c;请问如何知道现在有多少小孩在玩&#xff1f; 静态变量内存分析 1、静态变量被对象共享 2、静态变量可能在堆中&#xff0c;也可能在方法区的静态域中&#xff0c;这…

Python中的类和实例是什么意思

目录 python中的类是什么 python中的实例是什么 python中的类和实例有什么区别 总结 python中的类是什么 在Python中&#xff0c;类是一种用于创建对象的蓝图或模板。类定义了对象的属性和方法。对象是类的实例&#xff0c;它拥有类定义的属性和方法。 通过定义类&#xff…

【Ajax】笔记-JQuery发送jsonp请求

前端 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>jQuery-jsonp</title><style>#re…

Linux安装操作(Mac版本)

Parallels Desktop的简介 Parallels Desktop是Mac平台上的虚拟机软件&#xff0c;也是Mac平台最好的虚拟机软件之一。它允许用户在Mac OS X系统上同时运行其他操作系统&#xff0c;例如Windows、Linux等。Parallels Desktop为Mac用户提供了使用其他操作系统和软件的便利性&…