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

Bagaimana untuk menangkap ralat sisi pelayan untuk pelayan jsonrpc?

王林
王林ke hadapan
2024-02-13 21:12:091176semak imbas

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

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

}

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam