客户端把byte数组作为 body传给服务器,服务器报错
发布于 5 个月前 作者 jimhy 427 次浏览 来自 问答

服务端的HellWorld文件的say()函数改成 func (m *Login) login(session gate.Session, msg []byte) (result []byte, err string) { v := uint(msg[0]) fmt.Println(v) return msg, “” } 客户端发送ArrayBuffer过去服务器 let buffer = new ByteBuffer(); buffer.writeByte(3); let self = this; var topic = “Login/HD_Login”; self.mqant.request(topic, buffer, function(destinationName,data) { var message=JSON.parse(data.payloadString) if(message.Error!="") { console.error(message.Error); return; } console.log(message); }); }

这样发过去貌似服务器就报错了 [rpc_server.go:330] Login rpc func(HD_Login) error reflect: Call using map[string]interface {} as type []uint8 ----Stack---- goroutine 101 [running]: github.com/liangdas/mqant/rpc/base.(*RPCServer).runFunc.func3.1(0xc04209ec60, 0xc04227e1c0, 0xc04236a1c0, 0xc04237d9f8, 0xc04237d9e8) H:/golangServer/mqantserver/src/github.com/liangdas/mqant/rpc/base/rpc_server.go:327 +0x199 panic(0xabc1a0, 0xc0421f0fc0) D:/Go/src/runtime/panic.go:491 +0x2b0 reflect.Value.call(0xadff00, 0xc04211f550, 0x13, 0xb836b5, 0x4, 0xc042328810, 0x2, 0x2, 0x0, 0x0, …) D:/Go/src/reflect/value.go:371 +0x1ace reflect.Value.Call(0xadff00, 0xc04211f550, 0x13, 0xc042328810, 0x2, 0x2, 0x0, 0x0, 0x0) D:/Go/src/reflect/value.go:302 +0xde github.com/liangdas/mqant/rpc/base.(*RPCServer).runFunc.func3() H:/golangServer/mqantserver/src/github.com/liangdas/mqant/rpc/base/rpc_server.go:386 +0xef6 created by github.com/liangdas/mqant/rpc/base.(*RPCServer).runFunc H:/golangServer/mqantserver/src/github.com/liangdas/mqant/rpc/base/rpc_server.go:427 +0x824

github.com/liangdas/mqant/rpc/base/rpc_server.go:330 runtime/asm_amd64.s:510 runtime/panic.go:491 reflect/value.go:371 2018-07-22T20:30:54+08:00 [development] [E] [rpc_server.go:263] [] Login rpc func(HD_Login) error: Login rpc func(HD_Login) error reflect: Call using map[string]interface {} as type []uint8 ----Stack---- goroutine 101 [running]: github.com/liangdas/mqant/rpc/base.(*RPCServer).runFunc.func3.1(0xc04209ec60, 0xc04227e1c0, 0xc04236a1c0, 0xc04237d9f8, 0xc04237d9e8) H:/golangServer/mqantserver/src/github.com/liangdas/mqant/rpc/base/rpc_server.go:327 +0x199 panic(0xabc1a0, 0xc0421f0fc0) D:/Go/src/runtime/panic.go:491 +0x2b0 reflect.Value.call(0xadff00, 0xc04211f550, 0x13, 0xb836b5, 0x4, 0xc042328810, 0x2, 0x2, 0x0, 0x0, …) D:/Go/src/reflect/value.go:371 +0x1ace reflect.Value.Call(0xadff00, 0xc04211f550, 0x13, 0xc042328810, 0x2, 0x2, 0x0, 0x0, 0x0) D:/Go/src/reflect/value.go:302 +0xde github.com/liangdas/mqant/rpc/base.(*RPCServer).runFunc.func3() H:/golangServer/mqantserver/src/github.com/liangdas/mqant/rpc/base/rpc_server.go:386 +0xef6 created by github.com/liangdas/mqant/rpc/base.(*RPCServer).runFunc H:/golangServer/mqantserver/src/github.com/liangdas/mqant/rpc/base/rpc_server.go:427 +0x824

github.com/liangdas/mqant/rpc/base/rpc_server.go:263 github.com/liangdas/mqant/rpc/base/rpc_server.go:331 runtime/asm_amd64.s:510 runtime/panic.go:491

6 回复

Login rpc func(HD_Login) error reflect: Call using map[string]interface {} as type []uint8 日志说的很清楚吧 HD_Login 接口调用参数问题 你改的是say()

@liangdas 不好意思,之前那个是两个例子里面弄的,所以代码和错误信息对不上,我重新编辑了一下,你看一下。其实我的想法是这样的,想要客户端和服务器不用potobuf和json格式来通信,想要用二进制数组写到body里面,在代码里手动解析。因为客户端已经写好了二进制流的解析,如果换成json格式或potobuff格式的话,客户端改动很大。问问大神有没有办法直接把二进制文件封装到body里面,然后在手动自己解析每个结构体。谢谢

body里面本身就传的二进制流,所以你说的功能完全是可以实现的 [] Login rpc func(HD_Login) error: Login rpc func(HD_Login) error reflect: Call using map[string]interface {} as type []uint8

你确认你改的login函数就是HD_Login的映射? 有一点需要说明一下,二进制流里面 第一个和最后一个字节不能是 {和} 因为网关会判断,如果是{ } 会自动理解为一个json对象 再看看别的地方有没有调用Login/HD_Login

我客户端就只写了一个字节的内容到body里面 下面是服务器的代码 aa.png

之前服务器报错的,是因为客户端用了json再包了一层我的二进制流数据 我改了一下客户单的代码 222.png 这个时候服务器会报另一个错误 33.png 调试了一下服务器,说长度1错误 44.png 是不是body的二进制数据流格式有什么要求呢?这里我确实发了1个字节的数据过去 找到问题了,就是这个地方,如果我发1个字节的数据过去,会在这个地方报错 55.png 不太清楚为啥要这样判断。我发了4个字节的内容过去,就可以了

现在又有一个问题,就是服务器返回byte数组给客户端,客户端貌似收到的payloadBytes不对。 我服务器返回了4个字节值的数值,如下图: 77.png 但是客户端收到的payloadBytes却是32个字节,如下图: 66.png 是不是服务器在返回数据的时候,在里面写入了什么东西导致的? 原因找到了,貌似是这里的问题:如下图: 88.png 我不是用Protocol的,直接帮我转了protocal协议,所以客户端拿到的数据是错的。 现在我改成这样,是OK的,如下图: 99.png 这样改就不能支持protocalbuff了,所以麻烦大神看一下,怎么改好,我这个只能临时用。

回到顶部