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.
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.
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!