How to catch server side errors for jsonrpc server?

王林
Release: 2024-02-13 21:12:09
forward
1196 people have browsed it

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

php editor Zimo will introduce you how to capture server-side errors of the jsonrpc server. During the development process, server-side errors are often encountered, and it is very important to accurately capture these errors. To solve this problem, we can use try-catch statements to capture server-side errors and return error information to the client. In this way, we can better locate and handle server-side errors and improve program stability and reliability. In the following we will explain in detail how to achieve this process.

Question content

Suppose I have a basic golang jrpc server based on 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)
    }
}
Copy after login

Is there a way to print "Client disconnected!" when the client disconnects from the server? Is there a callback or something similar on 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

}
Copy after login

It would be nice if I didn't have to send jsonrpc heartbeat messages.

I tried periodically dummy reading from the conn in the goroutine, but this interferes with the jsonrpc connection.

Solution

The jsonrpc.ServeConn method returns when the client hangs up. Prints a "client disconnected" message after ServeConn returns.

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
        }()
    }
}
Copy after login

The above is the detailed content of How to catch server side errors for jsonrpc server?. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!