双向流 server服务端data,_ := allStr.Recv() data传入空参

双向流 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里面传入的空参

相关截图:

https://img1.sycdn.imooc.com//climg/636e49820985c60b13060269.jpg

尝试过的解决方式:

在data,_ := allStr.Recv() data代码块下面判断了一下,没有报错了但是一直有rpc error: code = Canceled desc = context canceled

相关截图:

https://img1.sycdn.imooc.com//climg/636e4aaf091ad96808950410.jpg

https://img1.sycdn.imooc.com//climg/636e4a650903171c15950570.jpg

相关代码:

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()
}


                                                                                     

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

这种一般都是自己的代码中有nil pointer 你截图我看看完整的错误栈,如果客户端没有,那么问题就会在服务端,也可以看看服务端的错误栈,你的错误栈中一定会有你自己的哪行代码报错的

  • _瓦达西瓦 提问者 #1

    报错在客户端Rev()中data传入空参,找到了原因了,协程的时候直接defer到done()了,没有wait(),谢谢老师


    2022-11-12 16:13:20
  • bobby 回复 提问者 _瓦达西瓦 #2

    好的,这种经典错误几乎都是自己的代码有问题,所以这种问题的错误栈一般都能找到自己的对应的代码

    2022-11-12 17:33:35
  • _瓦达西瓦 提问者 回复 bobby #3

    谢谢老师,debug学了一手哈哈



    2022-11-12 21:23:11
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Go开发工程师全新版
  • 参与学习       489    人
  • 解答问题       559    个

风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师