天天看点

golang rpc的两种调用方法

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

<code>package main</code>

<code>import (</code>

<code>        </code><code>"net/rpc"</code>

<code>        </code><code>"net/http"</code>

<code>        </code><code>"log"</code>

<code>        </code><code>"net"</code>

<code>        </code><code>"time"</code>

<code>)</code>

<code>type args struct {</code>

<code>        </code><code>a, b int</code>

<code>}</code>

<code>type arith int</code>

<code>func (t *arith) multiply(args *args, reply *([]string)) error {</code>

<code>        </code><code>*reply = append(*reply,</code><code>"test"</code><code>)</code>

<code>        </code><code>return</code> <code>nil</code>

<code>func main() {</code>

<code>        </code><code>arith :=</code><code>new</code><code>(arith)</code>

<code>        </code><code>rpc.register(arith)</code>

<code>        </code><code>rpc.handlehttp()</code>

<code>        </code> 

<code>        </code><code>l, e := net.listen(</code><code>"tcp"</code><code>,</code><code>":1234"</code><code>)</code>

<code>        </code><code>if</code> <code>e != nil {</code>

<code>                </code><code>log.fatal(</code><code>"listen error:"</code><code>, e)</code>

<code>        </code><code>}</code>

<code>        </code><code>go http.serve(l, nil)</code>

<code>        </code><code>time.sleep(5 * time.second)</code>

<code>        </code><code>client, err := rpc.dialhttp(</code><code>"tcp"</code><code>,</code><code>"127.0.0.1"</code> <code>+</code><code>":1234"</code><code>)</code>

<code>        </code><code>if</code> <code>err != nil {</code>

<code>                </code><code>log.fatal(</code><code>"dialing:"</code><code>, err)</code>

<code>        </code><code>args := &amp;args{7,8}</code>

<code>        </code><code>reply := make([]string, 10)</code>

<code>        </code><code>err = client.call(</code><code>"arith.multiply"</code><code>, args, &amp;reply)</code>

<code>                </code><code>log.fatal(</code><code>"arith error:"</code><code>, err)</code>

<code>        </code><code>log.println(reply)</code>

另一种是使用newserver

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

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

49

50

51

52

53

<code>        </code><code>//"net/http"</code>

<code>        </code><code>newserver := rpc.newserver()</code>

<code>        </code><code>newserver.register(</code><code>new</code><code>(arith))</code>

<code>        </code><code>l, e := net.listen(</code><code>"tcp"</code><code>,</code><code>"127.0.0.1:1234"</code><code>)</code><code>// any available address</code>

<code>                </code><code>log.fatalf(</code><code>"net.listen tcp :0: %v"</code><code>, e)</code>

<code>        </code><code>go newserver.accept(l)</code>

<code>        </code><code>newserver.handlehttp(</code><code>"/foo"</code><code>,</code><code>"/bar"</code><code>)</code>

<code>        </code><code>time.sleep(2 * time.second)</code>

<code>        </code><code>address, err := net.resolvetcpaddr(</code><code>"tcp"</code><code>,</code><code>"127.0.0.1:1234"</code><code>)</code>

<code>                </code><code>panic(err)</code>

<code>        </code><code>conn, _ := net.dialtcp(</code><code>"tcp"</code><code>, nil, address)</code>

<code>        </code><code>defer conn.close()</code>

<code>        </code><code>client := rpc.newclient(conn)</code>

<code>        </code><code>defer client.close()</code>

<code>第二个例子中的</code>

<code>newserver.handlehttp(</code><code>"/foo"</code><code>,</code><code>"/bar"</code><code>)</code>

<code>可以任意设置,第一个例子其实是设置了默认的两个</code>

<code> </code> 

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