Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk menangkap ralat sisi pelayan untuk pelayan jsonrpc?

Bagaimana untuk menangkap ralat sisi pelayan untuk pelayan jsonrpc?

王林
Lepaskan: 2024-02-13 21:12:09
ke hadapan
1235 orang telah melayarinya

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

Editor PHP Zimo memperkenalkan anda cara menangkap ralat sebelah pelayan pelayan jsonrpc. Semasa proses pembangunan, ralat sisi pelayan sering ditemui, dan adalah sangat penting untuk menangkap ralat ini dengan tepat. Untuk menyelesaikan masalah ini, kami boleh menggunakan kenyataan cuba-tangkap untuk menangkap ralat sisi pelayan dan mengembalikan maklumat ralat kepada klien. Dengan cara ini, kami boleh mencari dan mengendalikan ralat sebelah pelayan dengan lebih baik serta meningkatkan kestabilan dan kebolehpercayaan program. Dalam perkara berikut, kami akan menerangkan secara terperinci bagaimana untuk mencapai proses ini.

Kandungan soalan

Andaikan saya mempunyai pelayan jrpc golang asas berdasarkan 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)
    }
}
Salin selepas log masuk

Adakah terdapat cara untuk mencetak "Pelanggan terputus sambungan apabila pelanggan memutuskan sambungan dari pelayan? Adakah terdapat panggilan balik atau sesuatu yang serupa di 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

}
Salin selepas log masuk

Alangkah baiknya jika saya tidak perlu menghantar mesej degupan jantung jsonrpc.

Saya cuba membaca tiruan secara berkala dari conn dalam goroutine tetapi ini mengganggu sambungan jsonrpc.

Penyelesaian

Kaedah jsonrpc.ServeConn kembali apabila pelanggan menutup telefon. Mencetak mesej "klien terputus" selepas ServeConn kembali.

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
        }()
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk menangkap ralat sisi pelayan untuk pelayan jsonrpc?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan