Heim > Backend-Entwicklung > Golang > Wie kann ich serverseitige Fehler für den Jsonrpc-Server abfangen?

Wie kann ich serverseitige Fehler für den Jsonrpc-Server abfangen?

王林
Freigeben: 2024-02-13 21:12:09
nach vorne
1273 Leute haben es durchsucht

如何捕获 jsonrpc 服务器的服务器端错误?

Der PHP-Editor Zimo stellt Ihnen vor, wie Sie serverseitige Fehler des JSONRPC-Servers erfassen. Während des Entwicklungsprozesses treten häufig serverseitige Fehler auf, und es ist sehr wichtig, diese Fehler genau zu erfassen. Um dieses Problem zu lösen, können wir Try-Catch-Anweisungen verwenden, um serverseitige Fehler zu erfassen und Fehlerinformationen an den Client zurückzugeben. Auf diese Weise können wir serverseitige Fehler besser lokalisieren und behandeln sowie die Programmstabilität und -zuverlässigkeit verbessern. Im Folgenden erklären wir im Detail, wie dieser Prozess gelingt.

Frageninhalt

Angenommen, ich habe einen einfachen Golang-JrPC-Server, der auf TCP basiert:

package main

import (
    "fmt"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
)

type Arith int

type Args struct {
    A, B int
}

func (t *Arith) Add(args *Args, result *int) error {
    *result = args.A + args.B
    return nil
}

func RunServer() {
    arith := new(Arith)
    rpc.Register(arith)

    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error starting server:", err)
        return
    }
    defer listener.Close()

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }

        go jsonrpc.ServeConn(conn)
    }
}
Nach dem Login kopieren

Gibt es eine Möglichkeit, „Client getrennt!“ auszudrucken, wenn der Client die Verbindung zum Server trennt? Gibt es einen Rückruf oder ähnliches auf net.Conn?

func main() {
    go RunServer()
    client, err := jsonrpc.Dial("tcp", "localhost:8080")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    

    args := &Args{A: 3, B: 5}
    var result int
    
    // run a method
    err = client.Call("Arith.Add", args, &result)
    if err != nil {
        fmt.Println("Error calling Add method:", err)
        return
    }
    fmt.Printf("Result of %d + %d = %d\n", args.A, args.B, result)
    
    // suppose the client closes the client
    client.Close()
    // how does the server detect that the client is closed?
    // would be nice if I could print "client disconnected!"
    // without having to send jsonrpc heartbeats

}
Nach dem Login kopieren

Es wäre schön, wenn ich keine Jsonrpc-Heartbeat-Nachrichten senden müsste.

Ich habe in regelmäßigen Abständen versucht, Dummy-Lesungen von der Verbindung in der Goroutine durchzuführen, aber dies beeinträchtigt die JSONRPC-Verbindung.

Workaround

jsonrpc.ServeConn-Methode kehrt zurück, wenn der Client auflegt. Gibt die Meldung „Client getrennt“ aus, nachdem ServeConn zurückgekehrt ist.

func RunServer() {
    arith := new(Arith)
    rpc.Register(arith)

    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error starting server:", err)
        return
    }
    defer listener.Close()

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }

        go func() {
           jsonrpc.ServeConn(conn)
           fmt.Println("client disconnected") // <--- new code here
        }()
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich serverseitige Fehler für den Jsonrpc-Server abfangen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage