1 Star 0 Fork 1

abigbug / gdot

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
client.go 2.07 KB
一键复制 编辑 原始数据 按行查看 历史
KuRay 提交于 2020-10-09 10:40 . 1、第一次提交
package gdrpc
import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"strings"
"sync"
"gitee.com/abigbug/gdot/gdcore"
)
// NewClient NewClient
func NewClient(netAddr string) *Client {
return &Client{
netAddr: netAddr,
}
}
// Client Client
type Client struct {
sync.WaitGroup
c *rpc.Client
netAddr string
url string
OnConnected func()
OnClose func()
}
// NetAddr NetAddr
func (its *Client) NetAddr() string {
addr := its.Addr()
if split := strings.Split(addr, ":"); len(split) > 2 {
addr = fmt.Sprintf("%s:%s", its.netAddr, split[2])
}
return addr
}
// Addr Addr
func (its *Client) Addr() string {
return its.url
}
// CallNoRet CallNoRet
func (its *Client) CallNoRet(serviceMethod string, args interface{}) error {
return its.Call(serviceMethod, args, &gdcore.NoReturn{})
}
// Call Call
func (its *Client) Call(serviceMethod string, args, reply interface{}) error {
if nil == its.c {
return fmt.Errorf("rpc was not connected")
}
its.Add(1)
defer its.Done()
if e := its.c.Call(serviceMethod, args, reply); e != nil {
if e != rpc.ErrShutdown {
return e
}
// 尝试重连
its.c = nil
var conn net.Conn
if conn, e = net.Dial("tcp", its.url); nil != e {
if nil != its.OnClose {
its.OnClose()
}
return e
}
its.c = jsonrpc.NewClient(conn)
if nil != its.OnConnected {
its.OnConnected()
}
// 尝试再次调用
return its.c.Call(serviceMethod, args, reply)
}
return nil
}
// Connect Connect
func (its *Client) Connect(url string) error {
if nil != its.c {
if its.url == url {
return nil
}
its.Close()
}
split := strings.Split(url, "//")
if len(split) > 1 {
if split[0] == "rpc:" {
url = split[1]
} else {
return fmt.Errorf("invalid url %q", url)
}
} else {
url = split[0]
}
conn, e := net.Dial("tcp", url)
if nil != e {
return e
}
its.c = jsonrpc.NewClient(conn)
its.url = url
if nil != its.OnConnected {
its.OnConnected()
}
return nil
}
// Close Close
func (its *Client) Close() {
its.Wait()
its.c.Close()
its.c = nil
if nil != its.OnClose {
its.OnClose()
}
}
Go
1
https://gitee.com/abigbug/gdot.git
git@gitee.com:abigbug/gdot.git
abigbug
gdot
gdot
7424bbb5d2b3

搜索帮助