博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang rpc的两种调用方法
阅读量:5863 次
发布时间:2019-06-19

本文共 2350 字,大约阅读时间需要 7 分钟。

golang的rpc有两种方法进行调用,一种是rpc例子中给的:

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package main

import (

"net/rpc"    "net/http"    "log"    "net"    "time"

)

type Args struct {

A, B int

}

type Arith int

func (t Arith) Multiply(args Args, reply *([]string)) error {

*reply = append(*reply, "test")    return nil

}

func main() {

arith := new(Arith)    rpc.Register(arith)    rpc.HandleHTTP()         l, e := net.Listen("tcp", ":1234")    if e != nil {            log.Fatal("listen error:", e)    }    go http.Serve(l, nil)    time.Sleep(5 * time.Second)    client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234")    if err != nil {            log.Fatal("dialing:", err)    }         args := &Args{7,8}    reply := make([]string, 10)    err = client.Call("Arith.Multiply", args, &reply)    if err != nil {            log.Fatal("arith error:", err)    }    log.Println(reply)

}

另一种是使用NewServer

这种是当rpc已经注册的时候就要使用了另外一种了。即一个server只能在DefaultRPC中注册一种类型。

当Server使用rpc.NewServer的时候,client也需要进行下改动了

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main

import (

"net/rpc"    //"net/http"    "log"    "net"    "time"

)

type Args struct {

A, B int

}

type Arith int

func (t Arith) Multiply(args Args, reply *([]string)) error {

*reply = append(*reply, "test")    return nil

}

func main() {

newServer := rpc.NewServer()    newServer.Register(new(Arith))    l, e := net.Listen("tcp", "127.0.0.1:1234") // any available address    if e != nil {            log.Fatalf("net.Listen tcp :0: %v", e)    }    go newServer.Accept(l)    newServer.HandleHTTP("/foo", "/bar")    time.Sleep(2 * time.Second)    address, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1234")    if err != nil {            panic(err)    }    conn, _ := net.DialTCP("tcp", nil, address)    defer conn.Close()    client := rpc.NewClient(conn)    defer client.Close()    args := &Args{7,8}    reply := make([]string, 10)    err = client.Call("Arith.Multiply", args, &reply)    if err != nil {            log.Fatal("arith error:", err)    }    log.Println(reply)

}

1
第二个例子中的
1
newServer.HandleHTTP("/foo", "/bar")
1
可以任意设置,第一个例子其实是设置了默认的两个
1

1

这里也顺便将reply作为[]slice的例子给演示了下
1

本文转自轩脉刃博客园博客,原文链接:

,如需转载请自行联系原作者

你可能感兴趣的文章
Nginx 1.2.6 稳定版发布
查看>>
黄聪:如何使用CodeSmith批量生成代码(原创系列教程)
查看>>
HDOJ---1421 搬寝室[DP]
查看>>
JS 中的== 与 ===
查看>>
ES6 - 收藏集 - 掘金
查看>>
13.11. this is incompatible with sql_mode=only_full_group_by
查看>>
Python Module_openpyxl_处理Excel表格
查看>>
css动画实现div内图片逆时针旋转
查看>>
CSS的工作过程
查看>>
为什么码农要了解业务?
查看>>
微软整合实验(七):布署Exchange2010 Mailbox高可用(DAG)
查看>>
spring定时器----JobDetailBean
查看>>
我的友情链接
查看>>
XP下如何删除附件中的游戏组件
查看>>
Mysql提供sequence服务
查看>>
我的友情链接
查看>>
Git安装
查看>>
emma的几个不足之处
查看>>
Java工具类——UUIDUtils
查看>>
使用Node搭建reactSSR服务端渲染架构
查看>>