首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年6月23日 星期一 8:18pm

【仓颉三方库】 网络组件——rpc4cj

  • 25-04-17 15:01
  • 2414
  • 8498
juejin.cn

架构图

  • rpc4cj使客户端和服务端应用程序可以透明地进行通信,并简 化了连接系统的构建。

源码目录

arduino
代码解读
复制代码
. ├── README.md ├── doc │ ├── assets │ ├── cjcov │ ├── feature_api.md │ └── design.md ├── src │ └── attributes │ └── buffer │ └── exceptions │ └── grpc │ └── internal │ └── net │ └── resolver │ │ └── dns │ │ └── manual │ │ └── passthrough │ └── transport │ └── util └── test ├── HLT ├── LLT └── UT
  • doc存放库的设计文档、提案、库的使用文档、LLT 用例覆盖报告
  • src是库源码目录
  • test存放测试用例,包括HLT用例、LLT 用例和UT用例

接口说明

主要是核心类和成员函数说明,详情见  API

 使用说明

编译

编译描述和具体 shell 命令

linux x86 编译:

需要依赖 protobuf4cj, 可在 gitcode.com/Cangjie-TPC…  处编译获取 将构建完成的的 protobuf 文件夹复制到 rpc4cj 项目根目录下面

代码解读
复制代码
cjpm build

windows x86 编译:

前提:使用 openssl version 查看环境下有无 openssl, 版本为 OpenSSL 3.x.x,若无,可参考 github.com/openssl/ope… 官网的 Build and Install。

需要依赖 protobuf4cj, 可在 gitcode.com/Cangjie-TPC… 处编译获取 将构建完成的的 protobuf 文件夹复制到 rpc4cj 项目根目录下面

代码解读
复制代码
cjpm build

功能示例

需要安装 protobuf 软件及 protobuf4cj 插件: ubuntu 系统可使用以下命令安装 protobuf

bash
代码解读
复制代码
apt install -y protobuf-compiler protoc --version # 正确显示版本号即成功

编译安装 protobuf-gen-cj 插件,可在 gitcode.com/Cangjie-TPC… 处编译获取

使用 protobuf4cj 用该 proto 文件生成 helloworld_pb.cj 文件, 放入test/LLT中,可以使用以下命令,参考 README.md · Cangjie-TPC/protobuf4c - 码云 - 开源中国 (gitcode.com)

scss
代码解读
复制代码
protoc --cj_out=. --proto_path=. $(proto_files) #--cj_out= 指定输出地址,--proto_path=指定proto文件路径

一元调用功能示例

首先运行任意一版本语言的 helloworld server example,或本仓附带 go 版本 server 端 其他语言版本 server 端可于 Supported languages | gRPC 内获取

示例 proto 文件如下:

ini
代码解读
复制代码
syntax = "proto3"; option go_package = "google.golang.org/grpc/examples/helloworld/helloworld"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; package helloworld; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }

示例代码如下:

使用测试框架运行,将 “xxxx" 处替换为本地代码仓库地址,并将源代码文件放入test/LLT中。

javascript
代码解读
复制代码
// DEPENDENCE: ./helloworld.pb.cj // EXEC: cjc %import-path %L %l %f ./helloworld.pb.cj %project-path %project-L/protobuf -l protobuf-cj // EXEC: ./main from std import socket.* from rpc4cj import grpc.* from rpc4cj import transport.* from rpc4cj import exceptions.* from rpc4cj import util.* from std import collection.* from protobuf import protobuf.* from protobuf import grpc.* from std import time.* var port: UInt16 = 50051 main (){ var req = HelloRequest() var resp = HelloReply() req.name = "World" var con = dial("127.0.0.1:${port}") con.invoke("/helloworld.Greeter/SayHello", req, resp) println("result: ${resp}") }

启动仓内提供测试用 go 版本服务器

bash
代码解读
复制代码
./test/LLT/test_grpc_post/go_server

另开一终端执行命令

bash
代码解读
复制代码
python3 ci_test/main.py test

执行结果如下:

css
代码解读
复制代码
result: {message: "Hello World"}

流式调用功能示例

cangjie 双向流式调用的示例如下:

示例代码如下:

scss
代码解读
复制代码
from std import socket.* from rpc4cj import grpc.* from rpc4cj import transport.* from rpc4cj import exceptions.* from rpc4cj import util.* from std import collection.* from std import time.* from std import sync.* from protobuf import protobuf.* let strServer: String = "20221226abc" var port: UInt16 = 0 let num: Int64 = 5 main() { let ss: SocketServer = SocketServer(TCP, "127.0.0.1", port) port = ss.port spawn{ => println("ss=${ss.address}")//127.0.0.1:50051/hello let lis: GRPCServerSocket = GRPCServerSocket(GrpcSocketS(ss)) let server: Server = Server() registerGreeterServer(server, ServerTest()) server.serve(lis) } sleep(Duration.second) var req = HelloRequest() var resp = HelloReply() req.name = "World" var con = dial("127.0.0.1:${port}")//linux var stream = con.newStreamClient() stream.doStreamRequest("/helloworld.Greeter/SayHello") for (i in 0..num) { req.name = "World-" + i.toString() stream.sendStreamMsg(req) } var readstream = stream.closeAndRecv() while (readstream.recv(resp)) { println(resp) } return 0 } //protobuf 依赖 class ServerTest <: GreeterServer { public func SayHello(hr: HelloRequest): (HelloReply, GrpcError) { let hy: HelloReply = HelloReply() hy.message = "ceshi-20221227" println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0") println("received: hr.name = ${hr.name}") println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1") return (hy, GrpcError()) } public func mustEmbedUnimplementedGreeterServer() {} } public class HelloRequest <: Message & TypedMessage { private var p_name = Pb3String() public init() { m_innerInit() } public mut prop name: String { get() { p_name.get() } set(i_vtmp) { p_name.set(i_vtmp); markDirty() } } protected func m_size(): Int64 { var i_tmp = 0 if (!p_name.isEmpty()) { i_tmp += 1 + binSize(p_name.data) } return i_tmp } protected func m_isEmpty(): Bool { p_name.isEmpty() } protected func m_clear(): Unit { p_name.clear() } public func copyFrom(src: HelloRequest): HelloRequest { p_name = src.p_name m_innerCopyFrom(src) return this } public func clone(): HelloRequest { return HelloRequest().copyFrom(this) } public func unpack(src: T): Unit where T <: BytesReader { while (!src.isEmpty()) { let i_tmp = src.parseTag() match (i_tmp[0]) { case 1 => p_name.unpack(src) case _ => m_unknown(src, i_tmp) } } markDirty() } public func pack(out: T): Unit where T <: BytesWriter { if (!p_name.isEmpty()) { out.append(10); out.packBin(p_name.data) } m_unknown(out) } public func toString(): String { var i_tmp = StructPrinter() if (!p_name.isEmpty()) { i_tmp.append("name", p_name.get()) } return i_tmp.done().toString() } public func packi(out: BytesWriter) { match (out) { case i_tmp: SimpleWriter => pack(i_tmp) case _ => pack(out) } } public func unpacki(src: BytesReader) { match (src) { case i_stmp: SimpleReader => unpack(i_stmp) case _ => unpack(src) } } public static func empty() { HelloRequest() } public static func fromBytes(src: Collection) { let i_tmp = HelloRequest(); i_tmp.unpack(src); i_tmp } public static func fromBytes(src: BytesReader) { let i_tmp = HelloRequest(); i_tmp.unpack(src); i_tmp } } public class HelloReply <: Message & TypedMessage { private var p_message = Pb3String() public init() { m_innerInit() } public mut prop message: String { get() { p_message.get() } set(i_vtmp) { p_message.set(i_vtmp); markDirty() } } protected func m_size(): Int64 { var i_tmp = 0 if (!p_message.isEmpty()) { i_tmp += 1 + binSize(p_message.data) } return i_tmp } protected func m_isEmpty(): Bool { p_message.isEmpty() } protected func m_clear(): Unit { p_message.clear() } public func copyFrom(src: HelloReply): HelloReply { p_message = src.p_message m_innerCopyFrom(src) return this } public func clone(): HelloReply { return HelloReply().copyFrom(this) } public func unpack(src: T): Unit where T <: BytesReader { while (!src.isEmpty()) { let i_tmp = src.parseTag() match (i_tmp[0]) { case 1 => p_message.unpack(src) case _ => m_unknown(src, i_tmp) } } markDirty() } public func pack(out: T): Unit where T <: BytesWriter { if (!p_message.isEmpty()) { out.append(10); out.packBin(p_message.data) } m_unknown(out) } public func toString(): String { var i_tmp = StructPrinter() if (!p_message.isEmpty()) { i_tmp.append("message", p_message.get()) } return i_tmp.done().toString() } public func packi(out: BytesWriter) { match (out) { case i_tmp: SimpleWriter => pack(i_tmp) case _ => pack(out) } } public func unpacki(src: BytesReader) { match (src) { case i_stmp: SimpleReader => unpack(i_stmp) case _ => unpack(src) } } public static func empty() { HelloReply() } public static func fromBytes(src: Collection) { let i_tmp = HelloReply(); i_tmp.unpack(src); i_tmp } public static func fromBytes(src: BytesReader) { let i_tmp = HelloReply(); i_tmp.unpack(src); i_tmp } } //server 端 public abstract class GreeterServer <: Message { public func SayHello(hr: HelloRequest): (HelloReply, GrpcError) public func mustEmbedUnimplementedGreeterServer(): Unit protected func m_size(): Int64 { return 0 } protected func m_isEmpty(): Bool { return false } protected func m_clear(): Unit {} public func unpacki(_: BytesReader): Unit {} public func packi(_: BytesWriter): Unit {} public func toString(): String { return "" } } class UnimplementedGreeterServer <: GreeterServer { public func SayHello(_: HelloRequest): (HelloReply, GrpcError) { return (HelloReply(), GrpcError(Unimplemented, "method SayHello not implemented")) } public func mustEmbedUnimplementedGreeterServer() {} } interface UnsafeGreeterServer { func mustEmbedUnimplementedGreeterServer(): Unit } public func defaultAnyAndServerStreamToGrpcError(any: Any, ss: ServerStream): GrpcError { println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------0") println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------0") if (any is HelloRequest) { let hy: HelloRequest = (any as HelloRequest).getOrThrow() println("hy.name = ${hy.name}") } else if (any is HelloReply) { (any as HelloReply).getOrThrow() println("hy.message = hy.message") } let hr: HelloRequest = HelloRequest() for (i in 0..num) { hr.name = "ceshi-20221227-stream-" + i.toString() ss.sendMsg(hr) } var resp = HelloReply() for (_ in 0..num) { ss.recvMsg(resp) println("resp = ${resp}") } println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------1") println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------1") return NULL_ERR } var Greeter_ServiceDesc = ServiceDesc( serviceName: "helloworld.Greeter", handlerType: -1, streams: [StreamDesc(streamName: "SayHello", handler: StreamHandler(defaultAnyAndServerStreamToGrpcError) )], metadata: "./helloworld.proto" ) func registerGreeterServer(s: Server, srv: Message) { s.registerService(Greeter_ServiceDesc, srv) }

执行结果如下:

ini
代码解读
复制代码
ss=127.0.0.1:46327 ++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------0 ++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------0 resp = {message: "World-0"} resp = {message: "World-1"} resp = {message: "World-2"} resp = {message: "World-3"} resp = {message: "World-4"} ++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------1 ++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------1

DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。

erlang
代码解读
复制代码
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。` 1.OpenHarmony开发基础 2.OpenHarmony北向开发环境搭建 3.鸿蒙南向开发环境的搭建 4.鸿蒙生态应用开发白皮书V2.0 & V3.0 5.鸿蒙开发面试真题(含参考答案) 6.TypeScript入门学习手册 7.OpenHarmony 经典面试题(含参考答案) 8.OpenHarmony设备开发入门【最新版】 9.沉浸式剖析OpenHarmony源代码 10.系统定制指南 11.【OpenHarmony】Uboot 驱动加载流程 12.OpenHarmony构建系统--GN与子系统、部件、模块详解 13.ohos开机init启动流程 14.鸿蒙版性能优化指南 .......

压缩功能示例

可以启用默认 gzip 算法压缩请求数据,该示例需要和 test/LLT/grpc/compressor/helloworld.pb.cj 一起编译

示例代码如下:

typescript
代码解读
复制代码
from std import socket.* from rpc4cj import grpc.* from rpc4cj import transport.* from rpc4cj import exceptions.* from rpc4cj import util.* from std import sync.* from std import time.* from std import collection.* from protobuf import protobuf.* let strServer: String = "test pass" class ServerTest <: GreeterServer { public func SayHello(hr: HelloRequest): (HelloReply, GrpcError) { let hy: HelloReply = HelloReply() hy.message = strServer return (hy, GrpcError()) } public func mustEmbedUnimplementedGreeterServer() {} } var port: UInt16 = 50051 main() { let ss: SocketServer = SocketServer(TCP, "127.0.0.1", port) port = ss.port spawn{ => let lis: GRPCServerSocket = GRPCServerSocket(GrpcSocketS(ss)) let server: Server = Server() registerGreeterServer(server, ServerTest()) server.serve(lis) } sleep(Duration.second) var req = HelloRequest() var resp = HelloReply() req.name = "World" var con = dial("127.0.0.1:${port}")//linux con.useCompressor() con.invoke("/helloworld.Greeter/SayHello",req,resp) println(resp) return 0 }

执行结果如下:

lua
代码解读
复制代码
--------------------------111 inhr.name = World --------------------------111 {message: "test pass"}

拦截器功能示例

拦截器提供对请求的参数和获取到的请求的拦截以实现对数据的检查和控制,一元请求拦截器示例如下,该示例需要和 test/LLT/grpc/interceptor/helloworld.pb.cj 一起编译

示例代码如下:

swift
代码解读
复制代码
from std import socket.* from rpc4cj import grpc.* from rpc4cj import transport.* from rpc4cj import exceptions.* from rpc4cj import util.* from std import collection.* from std import sync.* from std import time.* from protobuf import protobuf.* let strServer: String = "World0123456789" class ServerTest <: GreeterServer { public func SayHello(_: HelloRequest): (HelloReply, GrpcError) { let hy: HelloReply = HelloReply() hy.message = strServer return (hy, GrpcError()) } public func mustEmbedUnimplementedGreeterServer() {} } var port: UInt16 = 50052 main() { let ss: SocketServer = SocketServer(TCP, "127.0.0.1", port) port = ss.port spawn{ => let lis: GRPCServerSocket = GRPCServerSocket(GrpcSocketS(ss)) let usi: UnaryServerInterceptor = getUnaryServerInterceptor() let so1: ServerOption = unaryInterceptor(usi) var opts: Array<ServerOption> = Array<ServerOption>([so1]) let server: Server = Server.newServer(opts) registerGreeterServer(server, ServerTest()) server.serve(lis) } sleep(Duration.second) var req = HelloRequest() var resp = HelloReply() req.name = "World" var opts = ArrayList<DialOption>() opts.append(WithUnaryInterceptor(unary())) var con = dial("127.0.0.1:${port}",opts )//linux con.invoke("/helloworld.Greeter/SayHello",req,resp) return 0 } func funcIns_1(_:Any,_:UnaryServerInfo, _:UnaryHandler): (Message, GrpcError) { println("测试服务端一元拦截器调用!") return (GrpcErrorMessage(), GrpcError()) } public func getUnaryServerInterceptor(): UnaryServerInterceptor{ let cal_Ins_UnaryServerInterceptor :UnaryServerInterceptor = UnaryServerInterceptor(funcIns_1) return cal_Ins_UnaryServerInterceptor } class unary <: UnaryInvoker { public func orderUnaryClientInterceptor(method: String, req: Message, _: Message): Unit { if (method == "/helloworld.Greeter/SayHello") { println(method) println("method ok") } else { throw Exception("error method") } var r = (req as HelloRequest).getOrThrow() if (r.name == "World") { println(r.name) println("request ok") } else { throw Exception("error method") } } }

执行结果如下:

sql
代码解读
复制代码
--------------------------000 inhr.name = World --------------------------000 测试服务端一元拦截器调用! /helloworld.Greeter/SayHello method ok World request ok

DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。

erlang
代码解读
复制代码
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。` 1.OpenHarmony开发基础 2.OpenHarmony北向开发环境搭建 3.鸿蒙南向开发环境的搭建 4.鸿蒙生态应用开发白皮书V2.0 & V3.0 5.鸿蒙开发面试真题(含参考答案) 6.TypeScript入门学习手册 7.OpenHarmony 经典面试题(含参考答案) 8.OpenHarmony设备开发入门【最新版】 9.沉浸式剖析OpenHarmony源代码 10.系统定制指南 11.【OpenHarmony】Uboot 驱动加载流程 12.OpenHarmony构建系统--GN与子系统、部件、模块详解 13.ohos开机init启动流程 14.鸿蒙版性能优化指南 .......

域名解析功能示例

客户端可以启用内置域名解析功能,提供对服务器域名的解析并连接,示例如下:

示例代码如下:

javascript
代码解读
复制代码
from std import socket.* from rpc4cj import grpc.* from rpc4cj import transport.* from rpc4cj import exceptions.* from rpc4cj import util.* from std import collection.* from std import time.* from std import sync.* from rpc4cj import resolver.* from rpc4cj import resolver.dns.* var port: UInt16 = 0 main() { let ss: SocketServer = SocketServer(TCP, "127.0.0.1", port) port = ss.port spawn{ => let lis: GRPCServerSocket = GRPCServerSocket(GrpcSocketS(ss)) let server: Server = Server() server.serve(lis) } sleep(Duration.second) try{ dial("passthrough:///127.0.0.1:${port}")//reslove localhost with } catch (e: Exception) { println("reslove failed") return 1 } println("reslove pass") return 0 }

执行结果如下:

python
代码解读
复制代码
reslove pass

TLS 安全连接功能示例

TLS 是一种网络传输层安全协议,可以为 rpc4cj 客户端应用程序和服务器端应用程序之间提供安全连接,示例如下: 注: 示例中使用到的密钥仅供参考,用户需要自行准备。

示例代码如下:

scss
代码解读
复制代码
// DEPENDENCE: ./example-cert.pem // DEPENDENCE: ./example-key.pem // EXEC: cjc %import-path %L %l %f %project-path %project-L/protobuf -l protobuf-cj // EXEC: ./main from std import socket.* from std import io.* from std import sync.* from std import time.* from std import collection.* from net import tls.* from rpc4cj import grpc.* from rpc4cj import transport.* from rpc4cj import exceptions.* from rpc4cj import util.* from protobuf import protobuf.* class ServerTest <: GreeterServer { // SayHello implements helloworld.GreeterServer public func SayHello(hr: HelloRequest): (HelloReply, GrpcError) { let hy: HelloReply = HelloReply() hy.message = "测试server端-20230224......哈哈哈哈,测试通了!" println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0") println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1") println("测试server端-20220919") println("received: hr.name = ${hr.name}") println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2") println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3") return (hy, GrpcError()) } public func mustEmbedUnimplementedGreeterServer() {} } var port: UInt16 = 50051 main(): Int64 { var cfgs = TlsServerConfig("./example-cert.pem","./example-key.pem") cfgs.alpnList = ["h2", "http/1.1"] let ss: TlsSocketServer = TlsSocketServer(TCP, "127.0.0.1", port, cfgs) port = ss.port spawn{ => println("ss=${ss.address}")//127.0.0.1:50051/hello let lis: GRPCServerSocket = GRPCServerSocket(GrpcTlsS(ss)) let server: Server = Server() registerGreeterServer(server, ServerTest()) server.serve(lis) } sleep(Duration.second) var req = HelloRequest() var resp = HelloReply() req.name = "World" var cfg = TlsClientConfig("./example-cert.pem") cfg.alpnList = ["h2", "http/1.1"] cfg.verifyMode = VerifyNone try { var con = dial("127.0.0.1:${port}", cfg: cfg)//linux con.invoke("/helloworld.Greeter/SayHello", req, resp) } catch(e: Exception) { e.printStackTrace() return -1 } println("result: ${resp}") println("result: {\"message\": \"Hello World\"}") return 0 } public class HelloRequest <: Message & TypedMessage { private var p_name = Pb3String() public init() { m_innerInit() } public mut prop name: String { get() { p_name.get() } set(i_vtmp) { p_name.set(i_vtmp); markDirty() } } protected func m_size(): Int64 { var i_tmp = 0 if (!p_name.isEmpty()) { i_tmp += 1 + binSize(p_name.data) } return i_tmp } protected func m_isEmpty(): Bool { p_name.isEmpty() } protected func m_clear(): Unit { p_name.clear() } public func copyFrom(src: HelloRequest): HelloRequest { p_name = src.p_name m_innerCopyFrom(src) return this } public func clone(): HelloRequest { return HelloRequest().copyFrom(this) } public func unpack(src: T): Unit where T <: BytesReader { while (!src.isEmpty()) { let i_tmp = src.parseTag() match (i_tmp[0]) { case 1 => p_name.unpack(src) case _ => m_unknown(src, i_tmp) } } markDirty() } public func pack(out: T): Unit where T <: BytesWriter { if (!p_name.isEmpty()) { out.append(10); out.packBin(p_name.data) } m_unknown(out) } public func toString(): String { var i_tmp = StructPrinter() if (!p_name.isEmpty()) { i_tmp.append("name", p_name.get()) } return i_tmp.done().toString() } public func packi(out: BytesWriter) { match (out) { case i_tmp: SimpleWriter => pack(i_tmp) case _ => pack(out) } } public func unpacki(src: BytesReader) { match (src) { case i_stmp: SimpleReader => unpack(i_stmp) case _ => unpack(src) } } public static func empty() { HelloRequest() } public static func fromBytes(src: Collection) { let i_tmp = HelloRequest(); i_tmp.unpack(src); i_tmp } public static func fromBytes(src: BytesReader) { let i_tmp = HelloRequest(); i_tmp.unpack(src); i_tmp } } public class HelloReply <: Message & TypedMessage { private var p_message = Pb3String() public init() { m_innerInit() } public mut prop message: String { get() { p_message.get() } set(i_vtmp) { p_message.set(i_vtmp); markDirty() } } protected func m_size(): Int64 { var i_tmp = 0 if (!p_message.isEmpty()) { i_tmp += 1 + binSize(p_message.data) } return i_tmp } protected func m_isEmpty(): Bool { p_message.isEmpty() } protected func m_clear(): Unit { p_message.clear() } public func copyFrom(src: HelloReply): HelloReply { p_message = src.p_message m_innerCopyFrom(src) return this } public func clone(): HelloReply { return HelloReply().copyFrom(this) } public func unpack(src: T): Unit where T <: BytesReader { while (!src.isEmpty()) { let i_tmp = src.parseTag() match (i_tmp[0]) { case 1 => p_message.unpack(src) case _ => m_unknown(src, i_tmp) } } markDirty() } public func pack(out: T): Unit where T <: BytesWriter { if (!p_message.isEmpty()) { out.append(10); out.packBin(p_message.data) } m_unknown(out) } public func toString(): String { var i_tmp = StructPrinter() if (!p_message.isEmpty()) { i_tmp.append("message", p_message.get()) } return i_tmp.done().toString() } public func packi(out: BytesWriter) { match (out) { case i_tmp: SimpleWriter => pack(i_tmp) case _ => pack(out) } } public func unpacki(src: BytesReader) { match (src) { case i_stmp: SimpleReader => unpack(i_stmp) case _ => unpack(src) } } public static func empty() { HelloReply() } public static func fromBytes(src: Collection) { let i_tmp = HelloReply(); i_tmp.unpack(src); i_tmp } public static func fromBytes(src: BytesReader) { let i_tmp = HelloReply(); i_tmp.unpack(src); i_tmp } } //server端 public abstract class GreeterServer <: Message { public func SayHello(hr: HelloRequest): (HelloReply, GrpcError) public func mustEmbedUnimplementedGreeterServer(): Unit protected func m_size(): Int64 { return 0 } protected func m_isEmpty(): Bool { return false } protected func m_clear(): Unit {} public func unpacki(_: BytesReader): Unit {} public func packi(_: BytesWriter): Unit {} public func toString(): String { return "" } } class UnimplementedGreeterServer <: GreeterServer { public func SayHello(_: HelloRequest): (HelloReply, GrpcError) { return (HelloReply(), GrpcError(Unimplemented, "method SayHello not implemented")) } //public func clone() { this } public func mustEmbedUnimplementedGreeterServer() {} } interface UnsafeGreeterServer { func mustEmbedUnimplementedGreeterServer(): Unit } /* public class DEFAULT_MESSAGELITE2 <: Message { public func clone() { this } } */ func Greeter_SayHello_Handler(srv: Message, dec: (Message) -> GrpcError, interceptor: ?UnaryServerInterceptor): (Message, GrpcError) { let inhr: HelloRequest = HelloRequest() var err: GrpcError = dec(inhr) if (!err.isNull()) { return (inhr, err) } match(interceptor){ case Some(v) => let info: UnaryServerInfo = UnaryServerInfo( server: srv, fullMethod: "/helloworld.Greeter/SayHello" ) println("--------------------------000") println("inhr.name = ${inhr.name}") println("--------------------------000") inhr.name = "dec(inhr)解析到的HelloRequest是空的???-----000" func handlercs(req: Any): (Any, GrpcError) { return (srv as (GreeterServer)).getOrThrow().SayHello((req as HelloRequest).getOrThrow()) //return srv.SayHello((req as HelloRequest).getOrThrow()) } return v.f(inhr, info, UnaryHandler(handlercs)) case None => println("--------------------------111") println("inhr.name = ${inhr.name}") println("--------------------------111") //inhr.name = "dec(inhr)解析到的HelloRequest是空的???-----111" return (srv as (GreeterServer)).getOrThrow().SayHello(inhr) //return srv.SayHello(inhr) } } public func defaultAnyAndServerStreamToGrpcError(any: Any, ss: ServerStream): GrpcError { println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------0") println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------0") if (any is HelloRequest) { let hy: HelloRequest = (any as HelloRequest).getOrThrow() println("hy.name = ${hy.name}") } else if (any is HelloReply) { let hy: HelloReply = (any as HelloReply).getOrThrow() println("hy.message = ${hy.message}") } let hr: HelloRequest = HelloRequest() hr.name = "测试processStreamingRPC--20221008!仓颉666" ss.sendMsg(hr) println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------1") println("++++++++++++++++++++++++++start-------------------defaultAnyAndServerStreamToGrpcError-------1") return NULL_ERR } var Greeter_ServiceDesc = ServiceDesc( serviceName: "helloworld.Greeter", handlerType: -1, methods: [MethodDesc(methodName: "SayHello", handler: Greeter_SayHello_Handler)], //streams: [StreamDesc(streamName: "SayHello", handler: StreamHandler(defaultAnyAndServerStreamToGrpcError) )], metadata: "./helloworld.proto" ) func registerGreeterServer(s: Server, srv: Message) { s.registerService(Greeter_ServiceDesc, srv) }

执行结果如下:

sql
代码解读
复制代码
ss=127.0.0.1:50051 --------------------------111 inhr.name = World --------------------------111 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1 测试server端-20220919 received: hr.name = World ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3 result: {message: "测试server端-20230224......哈哈哈哈,测试通了!"} result: {"message": "Hello World"}
注:本文转载自juejin.cn的别说我什么都不会的文章"https://juejin.cn/post/7493352451837607999"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
AndroidAndroid buildToolsVersion 会影响什么

Android buildToolsVersion 会影响什么

Android的buildToolsVersion(构建工具版本)是项目配置中的关键参数,直接影响开发流程和最终应用的多个方面。以下是其主要影响维度及对应的技术细节:一、构建过程与效率构建速度与性能优化新版本的构建工具通常包含性能改进(如增...
2025-04-25 3426 11691
Android面试题 - Android - Kotlin相关内容

面试题 - Android - Kotlin相关内容

1. Kotlin 简介及特性Kotlin 是一门由 JetBrains 开发的现代编程语言,可以在 JVM 上运行。主要特性包括:空安全(Null Safety)简洁的语法与 Java 100% 互操作支持函数式编程智能类型推断协程支持2...
2025-04-25 4246 12218
Android详解 Android APP 启动流程

详解 Android APP 启动流程

版权归作者所有,如有转发,请注明文章出处:cyrus-studio.github.io/blog/APP 启动流程app 启动流程大概如下:arduino代码解读复制代码发起进程(startActivity/startService...)...
2025-04-25 2598 11015
Android

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

在两个月前,我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式,而事实上 Platform 和 UI 线程合并,确实为后续原生语言和 Dart 的直接同步调用打了一个良好基础,在《Flutter Roadm...
2025-04-25 2929 5325
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

  • 1

    Android buildToolsVersion 会影响什么

  • 2

    面试题 - Android - Kotlin相关内容

  • 3

    详解 Android APP 启动流程

  • 4

    Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

  • 5

    Kotlin对Android整体编程有什么明显的改进,这几年自身有什么更新

  • 6

    「架构篇 2」认识 MVC / MVP / MVVM / MVI

  • 7

    「架构篇 1」认识 MVC / MVP / MVVM / MVI

  • 8

    一个Android 通用方便快捷使用IO库

  • 9

    从信也(拍拍贷),乐信年报及全球布局看未来行业发展趋势

  • 10

    Retrofit框架分析(二):注解、反射以及动态代理,Retrofit框架动态代理的源码分析

140
Android
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top