服務(wù)定義
package rpcdemo
import "errors"
// 服務(wù)
type DemoService struct {
}
// 參數(shù)
type Args struct {
A, B int
}
// jsonrpc 的服務(wù)需要定義為參入?yún)?shù)和傳出參數(shù)的格式
// 傳出參數(shù)必須為指針格式
func (e DemoService) DIV(args Args, result *float64) error {
if args.B == 0 {
return errors.New("division by zero")
}
*result = float64(args.A) / float64(args.B)
return nil
}
服務(wù)端
package main
import (
"github.com/zhaojigang/crawler/rpc"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
func main() {
// 注冊服務(wù)
rpc.Register(rpcdemo.DemoService{})
// 啟動 server
listener, err := net.Listen("tcp", "127.0.0.1:1234")
if err != nil {
panic(err)
}
for {
// 不斷連接服務(wù)
conn, err := listener.Accept()
if err != nil {
log.Printf("accept error, %v", err)
continue
}
// 使用 Goroutine:ServeConn runs the JSON-RPC server on a single connection.
go jsonrpc.ServeConn(conn)
}
}
客戶端
package main
import (
"fmt"
"github.com/zhaojigang/crawler/rpc"
"log"
"net/rpc/jsonrpc"
)
func main() {
// 連接server并創(chuàng)建jsonrpc-client
client, err := jsonrpc.Dial("tcp", "127.0.0.1:1234")
if err != nil {
log.Printf("create jsonrpc client error")
}
var result float64
// 發(fā)起調(diào)用
err = client.Call("DemoService.DIV", rpcdemo.Args{3, 4}, &result)
if err != nil {
log.Printf("call error")
}
fmt.Println(result)
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者