双向流 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开发工程师全新版
- 参与学习 530 人
- 解答问题 606 个
风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星