来自golang grpc服务器的颤振错误解码协议响应

来自golang grpc服务器的颤振错误解码协议响应,go,flutter,dart,protocol-buffers,grpc,Go,Flutter,Dart,Protocol Buffers,Grpc,我在golang中实现了一个简单的一元gRPC服务器,我通过本地WAN通过flatter从手机连接到它 protobuf请求只是一个int64时间戳,响应是一条包含Load类型的消息数组的单个消息LoadResponse 服务器完美地接收到请求,并且似乎正在返回响应,但是颤振难以解释请求,并且错误消息没有帮助: 我从Flatter收到两条消息,一条在调试中,另一条在屏幕上: 调试: InvalidProtocolBufferException:解析协议消息时,输入意外结束 在田野中间。这可能意味

我在
golang
中实现了一个简单的一元
gRPC
服务器,我通过本地WAN通过
flatter
从手机连接到它

protobuf请求只是一个
int64
时间戳,响应是一条包含
Load
类型的消息数组的单个消息
LoadResponse

服务器完美地接收到请求,并且似乎正在返回响应,但是颤振难以解释请求,并且错误消息没有帮助:

我从Flatter收到两条消息,一条在调试中,另一条在屏幕上:

调试:
InvalidProtocolBufferException:解析协议消息时,输入意外结束
在田野中间。这可能意味着
输入已被截断或嵌入了一条消息
歪曲了它自己的长度。

银幕上
gRPC错误(12,未收到响应)

首先,我不知道哪个错误是准确的,也没有意义。服务器肯定正在接收请求并返回响应。这意味着服务已成功识别,因此
gRPC状态代码12
错误显示为假警报

否则,调试消息不会暗示我的问题可能是什么。在我的flatter代码中,我使用了一个
FutureBuilder
来加载这个响应(因为它是一个一元调用),但也许我需要一个
StreamBuilder
,因为它包含一个消息数组

代码: 原生动物
syntax=“proto3”;
包客户端;
选项go_package=“lambdapb”;
消息时间戳{
int64时间戳=1;
}
消息加载请求{
时间戳时间戳=1;
}
服务加载服务{
rpc加载(LoadRequest)返回(LoadResponse){};
}
消息负载{
字符串deliverydate=1;
双分裂数=2;
管柱温度=3;
字符串firstname=4;
字符串loaddate=5;
双id=6;
双倍重量=7;
字符串ponumber=8;
字符串tsize=9;
字符串电话=10;
管柱设备=11;
字符串ext=12;
双倍英里=13;
字符串lastname=14;
}
消息加载响应{
重复荷载=1;
}
main.go(服务器)
主程序包
进口(
“上下文”
“加密/tls”
“编码/json”
“fmt”
“io/ioutil”
“军团服务器/lambdapb”
“日志”
“净额”
“net/http”
“网络/网址”
“字符串”
“时间”
“google.golang.org/grpc”
)
var tlsConf=&http.Transport{
TLSClientConfig:&tls.Config{
重新协商:tls.RENEGATEONCEASCLIENT,
},
}
var client=&http.client{
超时:时间。持续时间(5*时间。秒),
运输:tlsConf,,
}
func(*server)加载(ctx context.context,req*lambdapb.LoadRequest)(*lambdapb.LoadResponse,错误){
时间戳:=req.GetTimestamp().GetTimestamp()
fmt.Println(时间戳)
unixTime,err:=time.Unix(时间戳,0).MarshalText()
如果错误!=零{
fmt.Printf(“将时间戳转换为RFC 3339时出错:%v”,错误)
}
数据:=pullnewload(字符串(unixTime))
响应:=&lambdapb.LoadResponse{
加载:数据,
}
fmt.Println(响应)
返回响应,无
}
类型服务器结构{}
func main(){
listen,err:=net.listen(“tcp”,“0.0.0.0:50051”)
如果错误!=零{
log.Fatalf(“未能侦听%v”,错误)
}
serv:=grpc.NewServer()
lambdapb.RegisterLoadServiceServer(serv,&server{})
如果错误:=serv.Serve(侦听);错误!=nil{
log.Fatalf(“无法访问服务器:%v”,错误)
}
}
func pullNewLoads(时间戳字符串)[]*lambdapb.Load{
formData:=url.Values{
“top”:{“10”},
“lDate”:{时间戳},
}
req,err:=http.NewRequest(“POST”https://api.*********.com/AppAvailLoads?”,strings.NewReader(formData.Encode())
如果错误!=零{
fmt.Println(“创建请求时出错”)
}
请求头添加(“x-cdata-authtoken”,“**********”)
请求标题添加(“内容类型”、“应用程序/x-www-form-urlencoded”)
resp,err:=client.Do(请求)
如果错误!=零{
fmt.Println(“请求中的错误”)
fmt.Println(错误)
}
defer resp.Body.Close()//当pullNewLoads()返回时,defer仅调用Body.Close()
bodyBytes,err:=ioutil.ReadAll(resp.Body)
如果错误!=零{
log.Fatal(错误)
}
变量数据映射[字符串]接口{}
如果err:=json.Unmarshal(bodyBytes,&data);err!=nil{
fmt.Println(“错误解码json”)
}
值,err:=json.Marshal(数据[“值”]。([]接口{}))
如果错误!=零{
log.Fatal(错误)
}
var结果[]*lambdapb.Load
如果err:=json.Unmarshal(值和结果);err!=nil{
fmt.Printf(“错误解组到结构%v”,错误)
}
返回结果
}
颤振: 加载服务.dart
import'包:Lambda/proto/lambdapb/Lambda.pbgrpc.dart';
导入“package:fixnum/fixnum.dart”;
进口“包装:grpc/grpc.dart”;
类装入服务{
静态LoadServiceClient;
LoadService(){
客户端=LoadServiceClient(客户端通道(
"192.168.1.87",
港口:50051,
选项:ChannelOptions(凭据:ChannelCredentials.unsecure())
));
}
时间戳generateTimestamp(){
Timestamp Timestamp=新时间戳();
timestamp.setField(1,Int64((DateTime.now().subtract(Duration(days:365)).millissecondssinceepoch/1000.round());
返回时间戳;
}
未来的getNewLoads(){
打印(“启动请求”);
LoadRequest=LoadRequest();
setField(1,generateTimestamp());
打印(“字段集,等待”);
返回client.load(请求);
}
}
屏幕:
class RoleSelect扩展StatefulWidget{
加载服务api;
角色选择({Key}){
api=新的LoadService();
}
_RoleSelectState createState()=>\u RoleSelectState();
}
//更多代码
小部件构建(构建上下文){
返回中心(
孩子:傅