Maison > développement back-end > Golang > Comment détecter les erreurs côté serveur pour le serveur jsonrpc ?

Comment détecter les erreurs côté serveur pour le serveur jsonrpc ?

王林
Libérer: 2024-02-13 21:12:09
avant
1273 Les gens l'ont consulté

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

L'éditeur PHP Zimo vous présente comment capturer les erreurs côté serveur du serveur jsonrpc. Au cours du processus de développement, des erreurs côté serveur sont souvent rencontrées et il est très important de capturer ces erreurs avec précision. Pour résoudre ce problème, nous pouvons utiliser des instructions try-catch pour capturer les erreurs côté serveur et renvoyer les informations sur les erreurs au client. De cette façon, nous pouvons mieux localiser et gérer les erreurs côté serveur et améliorer la stabilité et la fiabilité du programme. Dans ce qui suit, nous expliquerons en détail comment réaliser ce processus.

Contenu de la question

Supposons que j'ai un serveur golang jrpc de base basé sur TCP :

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)
    }
}
Copier après la connexion

Existe-t-il un moyen d'imprimer « Client déconnecté ! » lorsque le client se déconnecte du serveur ? Y a-t-il un rappel ou quelque chose de similaire sur 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

}
Copier après la connexion

Ce serait bien si je n'avais pas à envoyer de messages de battement de coeur jsonrpc.

J'ai essayé périodiquement une lecture factice depuis le conn dans la goroutine mais cela interfère avec la connexion jsonrpc. La méthode

Workaround

jsonrpc.ServeConn est renvoyée lorsque le client raccroche. Imprime un message « client déconnecté » après le retour de ServeConn.

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
        }()
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal