服务定义
package rpcdemo
import "errors"
// 服务
type DemoService struct {
}
// 参数
type Args struct {
A, B int
}
// jsonrpc 的服务需要定义为参入参数和传出参数的格式
// 传出参数必须为指针格式
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
}
服务端
package main
import (
"github.com/zhaojigang/crawler/rpc"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
func main() {
// 注册服务
rpc.Register(rpcdemo.DemoService{})
// 启动 server
listener, err := net.Listen("tcp", "127.0.0.1:1234")
if err != nil {
panic(err)
}
for {
// 不断连接服务
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并创建jsonrpc-client
client, err := jsonrpc.Dial("tcp", "127.0.0.1:1234")
if err != nil {
log.Printf("create jsonrpc client error")
}
var result float64
// 发起调用
err = client.Call("DemoService.DIV", rpcdemo.Args{3, 4}, &result)
if err != nil {
log.Printf("call error")
}
fmt.Println(result)
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。