IO网络编程Day4

广播

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、将套接字设置成允许广播
    int broadcast = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast))==-1)
    {
        perror("setsockopt error");
        return -1;
    }
    
    //3、绑定(非必须)
    //4、填充接收端地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(6789);
    cin.sin_addr.s_addr = inet_addr("192.168.125.255");

    //5、发送消息
    char sbuf[128] = "";
    while(1)
    {
        printf("请输入>>>");
        fgets(sbuf, sizeof(sbuf), stdin);
        sbuf[strlen(sbuf)-1] = 0;

        //发送到广播地址中
        sendto(sfd, sbuf, sizeof(sbuf), 0, (struct sockaddr*)&cin, sizeof(cin));
        printf("发送成功\n");
    }
    

    //6、关闭套接字
    close(sfd);

    return 0;
}
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(6789);       //端口号
    rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播地址

    //3、绑定
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind error");
        return -1;
    }

    //4、接收消息
    char rbuf[128] = "";
    while(1)
    {
        //清空数组
        bzero(rbuf , sizeof(rbuf));

        //接收消息
        recvfrom(rfd, rbuf, sizeof(rbuf), 0, 0, 0);

        printf("收到消息为:%s\n", rbuf);
    }

    //5、关闭套接字
    close(rfd);

    return 0;
}

组播

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、绑定  非必须
    
    //3、填充地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(9999);
    sin.sin_addr.s_addr = inet_addr("224.1.2.3");

    //4、发送消息
    char sbuf[128] = "";
    while(1)
    {
        printf("请输入>>>");
        fgets(sbuf, sizeof(sbuf), stdin);
        sbuf[strlen(sbuf)-1] = 0;

        //将消息发送出去
        sendto(sfd, sbuf, sizeof(sbuf), 0, (struct sockaddr*)&sin, sizeof(sin));
        printf("发送成功\n");
    }

    //5、关闭套接字
    close(sfd);
    return 0;
}
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、设置网络属性
    struct ip_mreqn im;
    im.imr_multiaddr.s_addr = inet_addr("224.1.2.3");    //组播地址
    im.imr_address.s_addr = inet_addr("192.168.122.118");  //本机ip
    im.imr_ifindex = 2;             //网络索引

    if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &im, sizeof(im)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("加入多播组成功\n");

    //3、填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(9999);
    rin.sin_addr.s_addr = inet_addr("224.1.2.3");

    //4、绑定
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind error");
        return -1;
    }

    //5、接收消息
    char rbuf[128] = "";
    while(1)
    {
        bzero(rbuf, sizeof(rbuf));
        recvfrom(rfd, rbuf, sizeof(rbuf), 0, 0, 0);
        printf("收到消息为:%s\n", rbuf);
    }

    //6、关闭套接字
    close(rfd);

    return 0;
}

流式域套接字

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    //int sfd = socket(AF_UNIX, SOCK_RAW, IPPROTO_TCP);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }


    //由于域套接字的绑定函数,只能绑定一个不存在的套接字文件
    //所以,在绑定之前需要判断当前文件是否存在
    if(access("./unix", F_OK) == 0)
    {
        //表示文件存在,删除该文件
        if(unlink("./unix")==-1)
        {
            perror("unlink error");
            return -1;
        }
    }

    //2、填充地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;        //通信域
    //sun.sun_path = ".unix";            //字符串赋值不能使用赋值运算符
    strcpy(sun.sun_path, "./unix");      //绑定套接字文件

    //3、绑定地址信息结构体
    if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //4、监听
    if(listen(sfd, 128) ==-1)
    {
        perror("listen error");
        return -1;
    }

    //5、阻塞接收客户端链接请求
    //定义容器接收客户端地址信息结构体
    struct sockaddr_un cun;
    socklen_t socklen = sizeof(cun);

    int newfd = accept(sfd, (struct sockaddr*)&cun, &socklen);    //表示不接收客户端地址信息
    if(newfd == -1)
    {
        perror("accept error");
        return -1;
    }

    //6、收发数据
    char buf[128] = "";
    while(1)
    {
        //清空数组
        bzero(buf, sizeof(buf));

        int res = recv(newfd, buf, sizeof(buf), 0);       //读取消息
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s]: %s\n", cun.sun_path ,buf);

    }

    //7、关闭套接字
    close(newfd);
    close(sfd);


    return 0;
}
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    //int sfd = socket(AF_UNIX, SOCK_RAW, IPPROTO_TCP);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }


    //由于域套接字的绑定函数,只能绑定一个不存在的套接字文件
    //所以,在绑定之前需要判断当前文件是否存在
    if(access("./unix", F_OK) == 0)
    {
        //表示文件存在,删除该文件
        if(unlink("./unix")==-1)
        {
            perror("unlink error");
            return -1;
        }
    }

    //2、填充地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;        //通信域
    //sun.sun_path = ".unix";            //字符串赋值不能使用赋值运算符
    strcpy(sun.sun_path, "./unix");      //绑定套接字文件

    //3、绑定地址信息结构体
    if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //4、监听
    if(listen(sfd, 128) ==-1)
    {
        perror("listen error");
        return -1;
    }

    //5、阻塞接收客户端链接请求
    //定义容器接收客户端地址信息结构体
    struct sockaddr_un cun;
    socklen_t socklen = sizeof(cun);

    int newfd = accept(sfd, (struct sockaddr*)&cun, &socklen);    //表示不接收客户端地址信息
    if(newfd == -1)
    {
        perror("accept error");
        return -1;
    }

    //6、收发数据
    char buf[128] = "";
    while(1)
    {
        //清空数组
        bzero(buf, sizeof(buf));

        int res = recv(newfd, buf, sizeof(buf), 0);       //读取消息
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s]: %s\n", cun.sun_path ,buf);

    }

    //7、关闭套接字
    close(newfd);
    close(sfd);


    return 0;
}

报式域套接字

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    //int sfd = socket(AF_UNIX, SOCK_RAW, IPPROTO_TCP);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }


    //由于域套接字的绑定函数,只能绑定一个不存在的套接字文件
    //所以,在绑定之前需要判断当前文件是否存在
    if(access("./unix", F_OK) == 0)
    {
        //表示文件存在,删除该文件
        if(unlink("./unix")==-1)
        {
            perror("unlink error");
            return -1;
        }
    }

    //2、填充地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;        //通信域
    //sun.sun_path = ".unix";            //字符串赋值不能使用赋值运算符
    strcpy(sun.sun_path, "./unix");      //绑定套接字文件

    //3、绑定地址信息结构体
    if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //4、监听
    if(listen(sfd, 128) ==-1)
    {
        perror("listen error");
        return -1;
    }

    //5、阻塞接收客户端链接请求
    //定义容器接收客户端地址信息结构体
    struct sockaddr_un cun;
    socklen_t socklen = sizeof(cun);

    int newfd = accept(sfd, (struct sockaddr*)&cun, &socklen);    //表示不接收客户端地址信息
    if(newfd == -1)
    {
        perror("accept error");
        return -1;
    }

    //6、收发数据
    char buf[128] = "";
    while(1)
    {
        //清空数组
        bzero(buf, sizeof(buf));

        int res = recv(newfd, buf, sizeof(buf), 0);       //读取消息
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s]: %s\n", cun.sun_path ,buf);

    }

    //7、关闭套接字
    close(newfd);
    close(sfd);


    return 0;
}
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    //int sfd = socket(AF_UNIX, SOCK_RAW, IPPROTO_TCP);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }


    //由于域套接字的绑定函数,只能绑定一个不存在的套接字文件
    //所以,在绑定之前需要判断当前文件是否存在
    if(access("./unix", F_OK) == 0)
    {
        //表示文件存在,删除该文件
        if(unlink("./unix")==-1)
        {
            perror("unlink error");
            return -1;
        }
    }

    //2、填充地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;        //通信域
    //sun.sun_path = ".unix";            //字符串赋值不能使用赋值运算符
    strcpy(sun.sun_path, "./unix");      //绑定套接字文件

    //3、绑定地址信息结构体
    if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //4、监听
    if(listen(sfd, 128) ==-1)
    {
        perror("listen error");
        return -1;
    }

    //5、阻塞接收客户端链接请求
    //定义容器接收客户端地址信息结构体
    struct sockaddr_un cun;
    socklen_t socklen = sizeof(cun);

    int newfd = accept(sfd, (struct sockaddr*)&cun, &socklen);    //表示不接收客户端地址信息
    if(newfd == -1)
    {
        perror("accept error");
        return -1;
    }

    //6、收发数据
    char buf[128] = "";
    while(1)
    {
        //清空数组
        bzero(buf, sizeof(buf));

        int res = recv(newfd, buf, sizeof(buf), 0);       //读取消息
        if(res == 0)
        {
            printf("客户端已经下线\n");
            break;
        }
        printf("[%s]: %s\n", cun.sun_path ,buf);

    }

    //7、关闭套接字
    close(newfd);
    close(sfd);


    return 0;
}

TFTP文件传输

#include <myhead.h>
#define SER_PORT 69
#define SER_IP "192.168.125.64"
int upload(char* name)
{
	//以只读的形式打开文件
	int fd=-1;
	if((fd=open(name,O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	//创建用于通信的套接字文件描述符
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	//填充服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port= htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);
	socklen_t socklen = sizeof(sin);
	//向服务器发送上传请求
	short str1=0;
	short str2=0;
	char buf[516]="";
	//组装请求数据
	short *p1 = (short *)buf;
	*p1 =htons(2);
	char *p2 = buf+2;
	strcpy(p2,name);
	char *p3=p2+strlen(p2)+1;
	strcpy(p3,"octet");
	int len =4+strlen(p2)+strlen(p3);
	//向服务器发送请求
	sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	while(1)
	{
 
		bzero(buf,sizeof(buf));
		//接收ACK包
		int res1=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);
		//发送数据包
		short *p1 = (short *)buf;
		*p1 =htons(3);
		short *p2 = (short *)(buf+2);
		str1++;
		*p2=htons(str1);
		char *p3 =buf+4;
		int res=read(fd,p3,sizeof(buf)-4);
		//printf("%d\n",res);
		if(res<512)
		{
			sendto(cfd,buf,res+4,0,(struct sockaddr*)&sin,sizeof(sin));
			break;
		}
		sendto(cfd,buf,516,0,(struct sockaddr*)&sin,sizeof(sin));
		//printf("%d\n",res);
	}
	//关闭套接字
	close(cfd);
	//关闭文件指针
	close(fd);
	return 0;
 
 
}
int download(char* name)
{
	//以写的形式打开文件
	int fd=-1;
	if((fd=open(name,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open error");
		return -1;
	}
	//创建用于通信的套接字文件描述符
	int cfd = socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	//填充服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port= htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);
	socklen_t socklen = sizeof(sin);
	//向服务器发送下载请求
	short str=0;
	char buf[516]="";
	//组装请求数据
	short *p1 = (short *)buf;
	*p1 =htons(1);
	char *p2 = buf+2;
	strcpy(p2,name);
	char *p3=p2+strlen(p2)+1;
	strcpy(p3,"octet");
	int len =4+strlen(p2)+strlen(p3);
	//向服务器发送请求
	sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	while(1)
	{
		bzero(buf,sizeof(buf));
		//向后移动指针,读取数据
		lseek(cfd,4,SEEK_SET);
		int res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);
		char *sbuf=buf+4;
		write(fd,sbuf,res-4);
	//	printf("%d\n",res);
		//判断是否拷贝完成
		if(res<516)
		{
			break;
		}
		bzero(buf,sizeof(buf));
		short *p1 = (short *)buf;
		*p1 =htons(4);
		short *p2 = (short *)(buf+2);
		str++;
		*p2=htons(str);
	//	printf("%d\n",str);
		len =4;
		//发送ACK,继续拷贝
		sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	}
	//关闭套接字
	close(cfd);
	//关闭文件指针
	close(fd);
	return 0;
 
}
 
int main(int argc, const char *argv[])
{
	//创建菜单目录
	while(1)
	{
		printf("********选择对文件功能*********\t\n");
		printf("*************1.上传*********\t\n");
		printf("*************2.下载****************\t\n");
		printf("*************3.退出****************\t\n");
		int news;
		printf("请输入你要执行的功能\n");
		scanf("%d",&news);
		getchar();
		char name[128]="";
		char *file =name;
		switch(news)
		{
		case 1:
			printf("请输入要上传的文件名\n");
			fgets(name,sizeof(name),stdin);
			name[strlen(name)-1]=0;
			upload(file);
			break;
		case 2:
			printf("请输入要下载的文件名\n");
			fgets(name,sizeof(name),stdin);
			name[strlen(name)-1]=0;
			download(file);
			break;
		case 3:
			goto END;
		default:
			printf("输入内容不在选项内,请重新输入\n");
		}
		printf("请按任意键清屏!!!\n");
		getchar();
		system("clear");
	}
END:
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook五分钟基础速通

1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda&#xff0c;会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…

国标GB28181安防视频监控EasyCVR级联后上级平台视频加载慢的原因排查

国标GB28181协议安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时还…

2025考研数学汤家凤高数、线代、概率论视频,百度网盘资源+PDF讲义

现在天气逐渐变凉&#xff0c;同学们都放寒假了&#xff01;我个人觉得寒假是给有梦想的同学准备的&#xff01; 我当时就喜欢放寒暑假&#xff0c;我觉得放假的时候别人在玩&#xff0c;我就能抽时间学习&#xff0c;来超越别人。所以好好利用寒假&#xff0c;绝对在考研的复…

SpringBoot整合MyBatis项目进行CRUD操作项目示例

文章目录 SpringBoot整合MyBatis项目进行CRUD操作项目示例1.1.需求分析1.2.创建工程1.3.pom.xml1.4.application.properties1.5.启动类 2.添加用户2.1.数据表设计2.2.pojo2.3.mapper2.4.service2.5.junit2.6.controller2.7.thymeleaf2.8.测试 3.查询用户3.1.mapper3.2.service3…

深入解析JavaScript中的原型继承

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 原型继承是JavaScript中的一种非常重要的继承方式。理解原型继承对于…

学习JavaEE的日子 day13补 深入类加载机制及底层

深入类加载机制 初识类加载过程 使用某个类时&#xff0c;如果该类的class文件没有加载到内存时&#xff0c;则系统会通过以下三个步骤来对该类进行初始化 1.类的加载&#xff08;Load&#xff09; → 2.类的连接&#xff08;Link&#xff09; → 3.类的初始化&#xff08;In…

geemap学习笔记050:掩膜操作

前言 在进行相关操作时&#xff0c;往往需要对一部分范围的值进行掩膜&#xff0c;以去掉这一部分的值。Earth Engine中已经提供了相关的掩膜操作&#xff0c;下面将会详细的介绍一下mask、selfMask、updateMask。 1 导入库并加载数据 import ee import geemapee.Initialize…

细说JavaScript的数据类型(JavaScript的数据类型详解)

在JavaScript中有六种不同的数据类型&#xff0c;六种数据类型又分为5种简单数据类型&#xff08;基本数据类型&#xff09;和1中复杂数据类型&#xff08;引用数据类型&#xff09;&#xff0c;基本数据类型分为&#xff1a;字符串类型&#xff08;string&#xff09;、数值类…

基于频率滑动广义互相关的信号时延估计方法(MATLAB R2018A)

广义互相关&#xff08;Generalized Cross-Correlation, GCC&#xff09;方法是一种改进的互相关分析技术&#xff0c;用于更准确地估计信号的时间延迟。这种方法特别适用于噪声环境中的时延估计&#xff0c;因为它通过特定的加权处理提高了互相关函数的峰值的显著性&#xff0…

提升线上会议效率,解决Teams会议中常见网络问题

在企业组网场景中&#xff0c;在线会议是混合办公、跨地区办公模式下很重要的协作沟通手段&#xff0c;而在线会议如Teams这类应用对网络的实时性和即时性要求非常高&#xff0c;网络频繁中断、接入速度慢、登不进去等问题分分钟加剧用户的不满&#xff0c;导致汇报失败或者是交…

nexus3 npm-hosted仓库迁移

迁移背景&#xff1a; 从nexus 3.33 升级到 nexus 3.64 过程中&#xff0c;私服 npm-hosted 无法上传。由于这个 npm-hosted 和 npm-proxy 放的同一个 blob存储&#xff0c;无法单独拆除去&#xff0c;所以采用迁移的方式 迁移思路&#xff1a; down下来 npm-hosted 仓库&am…

【Java】HttpServlet类简单方法和请求显示

1、HttpServlet类简介&#x1f340; Servlet类中常见的三个类有&#xff1a;☑️HttpServlet类&#xff0c;☑️HttpServletRequest类&#xff0c;☑️HttpResponse类 &#x1f42c;其中&#xff0c;HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对…

WebGL中开发VR(虚拟现实)应用

WebGL&#xff08;Web Graphics Library&#xff09;是一种用于在浏览器中渲染交互式3D和2D图形的JavaScript API。要在WebGL中开发VR&#xff08;虚拟现实&#xff09;应用程序&#xff0c;您可以遵循以下一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&a…

docker环境下mongo副本集的部署及异常修复

最近更换了办公地点。部署在本地docker环境里的mongo数据库不能使用了。原因是本地的ip地址变更。以前的mongo副本集的配置需要更新。处理完后&#xff0c;索性重新记录一下mongo副本集在docker中的部署流程。 mongo的事务及副本集 我们先了解一下什么是事务&#xff0c;事务…

虚拟化网络

vm1和vm2通过虚拟交换机与主机进行交换&#xff0c; 虚拟交换机&#xff1a;&#xff08;通过软件虚拟出来的交换机&#xff09; 1、LinuxBridge虚拟交换机 2、OVS&#xff08;Open Virtual Switch&#xff09;虚拟交换机 虚拟机的传输是通过虚拟交换机&#xff0c;然后连到…

Servlet 预览pdf

一、背景 上篇文章介绍了图片的预览&#xff0c;这篇我们介绍下 pdf 文件的预览&#xff0c;pdf 预览在实际开发中用的还是比较多的&#xff0c;比如很多文件协议、合同都是用pdf 格式&#xff0c;协议预览就需要我们做 pdf 预览了。 二、实操 其实在上篇文章最后已经说了常用…

在Android原生项目中 创建 Flutter模块

前言 应用场景&#xff1a;在已有的Android原生项目中&#xff0c;引入Flutter模块&#xff0c;摸索了两天&#xff0c;终于给整出来了&#xff1b; 如果是新项目&#xff0c;最好直接创建Flutter项目&#xff0c;然后在Fluter的 android / ios目录中&#xff0c;写原生代码&…

常见的设计模式(模板与方法,观察者模式,策略模式)

前言 随着时间的推移&#xff0c;软件代码越来越庞大&#xff0c;随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前&#xff0c;使用的是面向过程开发来设计大型的软件程序&#xff0c;面向过程开发将软件分成一个个单独的模块&#xff0c;模块之间使用函数…

Spark SQL函数定义

目录 窗口函数 SQL函数分类 Spark原生自定义UDF函数 Pandas的UDF函数 Apache Arrow框架基本介绍 基于Arrow完成Pandas DataFrame和Spark DataFrame互转 基于Pandas完成UDF函数 自定义UDF函数 自定义UDAF函数 窗口函数 分析函数 over(partition by xxx order by xxx [as…

MathType2024下载安装系统要求及新版本功能介绍

MathType 7应用介绍 MathType可适用于800软件应用程序和网站&#xff0c;支持在任何文字处理软件、演示程序、页面程序、HTML编辑工具及其它类型的软件&#xff0c;用来建立公式。 应用范围&#xff1a;期刊杂志、科研机构、教育教学、工程学、统计学、论文、报告写作、word文…