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

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

王林
王林avant
2024-02-13 21:12:091227parcourir

如何捕获 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)
    }
}

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

}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer