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 := &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, &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>