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

旅游网站如何做西安计算机培训机构哪个最好

旅游网站如何做,西安计算机培训机构哪个最好,微信公众号运营策划,小程序推广收费价目表系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、拷贝任意文件进项目四、编写serve…

系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例
第五章 多proto文件示例
第六章 服务器流式传输
第七章 客户端流式传输
第八章 双向流示例


文章目录

  • 一、前言
  • 二、定义proto文件
  • 三、拷贝任意文件进项目
  • 四、编写server服务端
  • 五、编写client客户端
  • 六、测试
  • 六、示例代码


一、前言

前面我们一直在讲的是服务端、客户端一问一答,最普通且常用的RPC服务。接下来本文介绍的是服务器流式传输。主要应用场景就是客户端请求服务端,从服务端下载视频、文件、图片等等。

二、定义proto文件

新建stream.proto文件

// 指定proto版本
syntax = "proto3";
// 指定默认包名
package stream_proto;
// 指定golang包名
option go_package = "/stream_proto";//定义个流服务,叫什么名字无所谓
service ServiceStream {//下载文件,关键字streamrpc DownloadFile(Request)returns(stream FileResponse){}
}
//请求参数
message Request{string name = 1;
}//文件回调参数
message FileResponse{//字节数据类型,即文件内容、数据bytes content =1;
}

go_grpc_study/example_4/grpc_proto目录下新建Terminal,执行生成文件,命令如下

protoc --go_out=. --go-grpc_out=. ./stream.proto

目录结构变更后为

具体步骤如下:

  • 1)定义回调message结构体FileResponse,使用bytes数据类型
  • 2)定义ServiceStream服务
  • 2)在服务里面,定义rpc方法DownloadFile,使用关键词stream回调FileResponse结构体

三、拷贝任意文件进项目

任意文件,可以是视频、音频、图片、文档等等,不做限制。这里以一张png图片为例。
新建static目录,拷贝一张grpc.pngstatic目录
图片如下:

目录结构如下

四、编写server服务端

新建server目录,新建main.go文件
目录结构如下

编写server/main.go文件

package mainimport ("fmt""go_grpc_study/example_4/grpc_proto/stream_proto""google.golang.org/grpc""io""log""net""os"
)//服务端流式// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type ServiceStream struct {stream_proto.UnimplementedServiceStreamServer
}func (ServiceStream) DownloadFile(request *stream_proto.Request, stream stream_proto.ServiceStream_DownloadFileServer) error {fmt.Println("DownloadFile", request)//分片读的方式读取图片file, err := os.Open("../static/grpc.png")if err != nil {return err}defer file.Close()for {buf := make([]byte, 1024)_, err = file.Read(buf)//当读取完后跳出循环if err == io.EOF {break}//出现异常后跳出循环if err != nil {break}stream.Send(&stream_proto.FileResponse{Content: buf,})}return nil
}func main() {// 监听端口listen, err := net.Listen("tcp", ":8080")if err != nil {log.Fatal(err)}// 创建一个gRPC服务器实例。s := grpc.NewServer()// 将server结构体注册为gRPC服务。stream_proto.RegisterServiceStreamServer(s, &ServiceStream{})fmt.Println("grpc server running :8080")// 开始处理客户端请求。err = s.Serve(listen)
}

具体步骤如下:

  • 1)定义1个结构体,结构体名称无所谓,必须包含stream_proto.UnimplementedServiceStreamServer 对象
  • 2)实现 .proto文件中定义的API即DownloadFile下载文件方法
  • 3)分片读的方式读取图片,并把图片数据响应给客户端,每次1024个字节数据
  • 4)将服务描述及其具体实现注册到 gRPC

五、编写client客户端

新建client目录,新建main.go文件
目录结构如下

编写clinet/main.go文件

package mainimport ("bufio""context""fmt""go_grpc_study/example_4/grpc_proto/stream_proto""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""io""log""os"
)func main() {addr := ":8080"// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。// 此处使用不安全的证书来实现 SSL/TLS 连接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))}defer conn.Close()client := stream_proto.NewServiceStreamClient(conn)//发送消息给服务端stream, err := client.DownloadFile(context.Background(), &stream_proto.Request{Name: "周八",})//缓冲写的方式另存为新的图片//os.O_CREATE : 创建并打开一个新文件//os.O_TRUNC :打开一个文件并截断它的长度为零(必须有写权限)//os.O_WRONLY :以只写的方式打开file, err := os.OpenFile("../static/grpc_new.png", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {log.Fatalln(err)}defer file.Close()writer := bufio.NewWriter(file)var index intfor {index++response, errRecv := stream.Recv()if errRecv == io.EOF {break}if errRecv != nil {fmt.Println(errRecv)break}fmt.Printf("第 %d 次,写入 %d 数据\n", index, len(response.Content))writer.Write(response.Content)}writer.Flush()
}

具体步骤如下:

  • 1)首先使用 grpc.Dial()gRPC 服务器建立连接
  • 2)使用 stream_proto.NewServiceStreamClient(conn)初始化客户端
  • 3)通过客户端调用ServiceAPI方法client.DownloadFile,并得到stream对象
  • 4)通过stream对象的Recv()方法得到[]byte数据
  • 5)通过缓冲写的方式另存为新的图片grpc_new.png

六、测试

server目录下,启动服务端

go run main.go

clinet目录下,启动客户端

go run main.go

服务端运行结果

客户端运行结果。我这个图片是119808 字节,最后走了 117 次,写入1024 数据

客户端下载的图片保存结果

六、示例代码

go_grpc_study:grpc学习golang版


完成ヾ(◍°∇°◍)ノ゙

http://www.dinnco.com/news/25184.html

相关文章:

  • 长沙微网站电话号码武汉seo网站管理
  • 网站建设资讯版块如何做用户运营百度自己的宣传广告
  • 最火网站排名北京网站快速优化排名
  • 苍南规划建设局网站seo推广费用需要多少
  • 广州专业网站改版领军企业收录之家
  • 网站建设与规划实训总结百度一下搜索引擎
  • 网站维护工作关键词搜索排名软件
  • 五月色做受网站最有效的网络推广方式和策略
  • 哪些网站的登陆界面做的好看响应式模版移动优化
  • 吉林省建设厅网站手机自己怎么建电影网站
  • 只做网站应该找谁广州seo优化电话
  • 石家庄做网站最好的公司有哪些seo有些什么关键词
  • moodle做网站seo整站网站推广优化排名
  • 刚注册公司怎么做网站珠海百度关键词优化
  • 仙居住房和城乡建设规划局网站百度竞价价格
  • 手机优化助手怎么关闭网站推广优化设计方案
  • 厦门b2b网站建设神马seo服务
  • 一个服务器可以做两个网站国际重大新闻事件2023
  • 手机网站怎么做今天发生的重大新闻内容
  • 做网站开公司东莞网站建设
  • 浙江网站备案加急合肥网站优化seo
  • 浙江省嘉兴建设局官方网站网推怎么做最有效
  • 公司网站建设的费用如何入账网页模板怎么用
  • 小程序怎么做优惠券网站东莞营销网站建设直播
  • asp网站 攻击怎么做个网站
  • 接帮人家做网站的网站株洲seo优化报价
  • 南京做网站优化的公司百度灰色关键词排名代做
  • 专业房产网站建设营销推广方案ppt案例
  • 新手如何建设网站app推广30元一单
  • 做策划有帮助的网站域名注册网站系统