2016-09-29 4 views
2

Ich versuche, einfache Grpc-Server und Client-Modell mit nur Methode für serverseitige Streaming zu implementieren. Ich falle die route guide example in offical repo. Beim Versuch, erhalte ich diesen Fehler von Server-SeiteLaufzeitfehler: ungültige Speicheradresse oder Nil-Zeiger Dereferenz, Grpc Golang Beispiel

panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xb code=0x1 addr=0x0 pc=0x4011fc] 

goroutine 3 [running]: 
panic(0x878c80, 0xc82000a150) 
    /usr/local/go/src/runtime/panic.go:481 +0x3e6 
main.(*server).Podips(0xc820136188, 0xc82000aa40, 0x7f1179b9f530, 0xc82000aa90, 0x0, 0x0) 
    /home/tcs/gowork/src/poc/test/server.go:22 +0x1fc 
poc/test/pb._Getips_Podips_Handler(0x856f00, 0xc820136188, 0x7f1179b9f438, 0xc8201da000, 0x0, 0x0) 
    /home/tcs/gowork/src/poc/test/pb/getip.pb.go:129 +0x175 
google.golang.org/grpc.(*Server).processStreamingRPC(0xc82019a640, 0x7f1179b245a0, 0xc8201ca000, 0xc8201d0000, 0xc820169440, 0xb7afa0, 0xc82016a570, 0x0, 0x0) 
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:689 +0x489 
google.golang.org/grpc.(*Server).handleStream(0xc82019a640, 0x7f1179b245a0, 0xc8201ca000, 0xc8201d0000, 0xc82016a570) 
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:773 +0x1151 
google.golang.org/grpc.(*Server).serveStreams.func1.1(0xc820133020, 0xc82019a640, 0x7f1179b245a0, 0xc8201ca000, 0xc8201d0000) 
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:422 +0xa0 
created by google.golang.org/grpc.(*Server).serveStreams.func1 
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:423 +0x9a 
exit status 2 

und diese von Client-Seite

2016/09/29 22:31:37 transport: http2Client.notifyError got notified that the client transport was broken EOF. 
2016/09/29 22:31:37 &{0xc820192b40}.Podips(_) = _, rpc error: code = 13 desc = transport is closing 
exit status 1 

server.go

package main 

import (
    "net" 
    "flag" 
    "fmt" 

    "google.golang.org/grpc/grpclog" 
    "google.golang.org/grpc" 
    pb "poc/test/pb" 
) 

var port = flag.Int("port", 10000, "The server port") 
type server struct{ 
    ip *pb.Ips 
} 

func (s *server) Podips(n *pb.Request, stream pb.Getips_PodipsServer) (error){ 

    res := [3]string{"firstIP", "secondIp", "thirdIP"} 

    for _, v := range res { 

     s.ip.Ip = v 
     if s.ip == nil{ 
      if err := stream.Send(s.ip); err != nil { 
        return err 
      } 
     } 
    } 

    return nil 
} 

func main(){ 
    flag.Parse() 
    lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) 
    if err != nil { 
     grpclog.Fatalf("failed to listen: %v", err) 
    } 
    grpcServer := grpc.NewServer() 
    grpclog.Println("server descrption:%v", grpcServer) 
    pb.RegisterGetipsServer(grpcServer, new(server)) 
    grpcServer.Serve(lis) 

} 

some.proto Datei

syntax = "proto3"; 

package getips; 

service Getips { 
    rpc Podips (Request) returns (stream Ips){} 

} 

message Request { 
    string req = 1; 

} 
message Ips { 
    string ip = 1; 
} 
zu laufen

Ich gehe durch einige Questio ns in Stapelüberlauf zu Null Pointer Fehler fand ich dieses Stückchen Code ist Schuldige

s.ip.Ip = v 
if s.ip == nil{ 
    if err := stream.Send(s.ip); err != nil { 
      return err 
    } 

Ich weiß nicht, wie dieses Problem zu lösen, und ich bezweifle, dass ich es falsch bin der Umsetzung. Jede Hilfe wäre gut. Danke

+1

Beachten Sie, dass die Stack-Trace zeigt Ihnen genau, wo der Fehler ist: '/home/tcs/gowork/src/poc/test/server.go: 22' – JimB

+0

Oh danke, ich habe das nicht gesehen. Aber irgendwie habe ich es gefunden, das Problem ist, ich weiß nicht, wie ich es lösen soll. –

Antwort

0

Sie tun new(server) ohne Initialisierung des Feldes server.ip. Ich kenne die Details der Implementierung nicht, aber Sie müssen dieses Feld grundsätzlich zuerst initialisieren, andernfalls ist nil und wenn Sie s.ip.Ip aufrufen, erhalten Sie einen Fehler.

+0

Danke, dass Sie darauf hingewiesen haben. Aber neu (Server) ist nicht das Problem. Anstelle von s.ip.Ip = v habe ich s.ip = {Ip: v} verwendet. Das hat es gelöst. –

Verwandte Themen