双向流 server服务端data,_ := allStr.Recv() data传入空参
问题描述:
跟着老师的代码敲了一下显示panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x28 pc=0xdfeda8],debug了一下发现data,_ := allStr.Recv() data里面传入的空参
相关截图:
尝试过的解决方式:
在data,_ := allStr.Recv() data代码块下面判断了一下,没有报错了但是一直有rpc error: code = Canceled desc = context canceled
相关截图:
相关代码:
package main import ( "LearnGO/Ch14/stream_grpc_test/proto" "fmt" "google.golang.org/grpc" "net" "sync" "time" ) const PORT = ":50052" type server struct { } func (s *server) Getstream(req *proto.StreamReqData, res proto.Greeter_GetstreamServer) error { i := 0 for { i ++ res.Send(&proto.StreamResData{ Data: fmt.Sprintf("%v",time.Now().Unix()), }) time.Sleep(time.Second) if i > 10 { break } } return nil } func (s *server)Putstream(cliStr proto.Greeter_PutstreamServer) error { for{ a,err := cliStr.Recv() if err != nil { fmt.Println(err) }else { fmt.Println(a.Data) } }相关代码: return nil } func (s *server)Allstream(allStr proto.Greeter_AllstreamServer) error { wg := sync.WaitGroup{} wg.Add(2) go func() { defer wg.Done() data,_ := allStr.Recv() fmt.Println("收到客户端消息:"+data.Data) //fmt.Println("收到客户端消息:"+data.Data) }() go func() { defer wg.Done() for{ _ = allStr.Send(&proto.StreamResData{Data: "我是服务器"}) time.Sleep(time.Second) } }() wg.Done() return nil } func main() { lis,err := net.Listen("tcp",PORT) if err != nil { panic(err) } s := grpc.NewServer() g := server{} proto.RegisterGreeterServer(s,&g) err = s.Serve(lis) if err != nil { panic(err) } } package main import ( "LearnGO/Ch14/stream_grpc_test/proto" "context" "fmt" "google.golang.org/grpc" "sync" "time" ) func main() { conn ,err := grpc.Dial("localhost:50052",grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() //服务端流模式 c := proto.NewGreeterClient(conn) res,_ := c.Getstream(context.Background(),&proto.StreamReqData{Data: "慕课网"}) for { a, err := res.Recv() if err != nil { fmt.Println(err) break } fmt.Println(a) } //客户端流模式 putS,_ := c.Putstream(context.Background()) i := 0; for { i++ _ = putS.Send(&proto.StreamReqData{ Data: fmt.Sprintf("慕课网%d",i), }) time.Sleep(time.Second) if i > 10 { break } } //双向流模式 allStr,_ := c.Allstream(context.Background()) wg := sync.WaitGroup{} wg.Add(2) go func() { defer wg.Done() for { data,_ := allStr.Recv() fmt.Println("收到服务端消息:"+data.Data) } }() go func() { defer wg.Done() for{ _ = allStr.Send(&proto.StreamReqData{Data: "慕课网"}) time.Sleep(time.Second) } }() wg.Done() }
29
收起
正在回答
1回答
这种一般都是自己的代码中有nil pointer 你截图我看看完整的错误栈,如果客户端没有,那么问题就会在服务端,也可以看看服务端的错误栈,你的错误栈中一定会有你自己的哪行代码报错的
Go开发工程师全新版
- 参与学习 489 人
- 解答问题 559 个
风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星