golang rpc的兩種調用方法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

golang的rpc有兩種方法進行調用,一種是rpc例子中給的:

package mainimport (        "net/rpc"        "net/http"        "log"        "net"        "time")type Args struct {        A, B int}type Arith intfunc (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也需要進行下改動了

package mainimport (        "net/rpc"        //"net/http"        "log"        "net"        "time")type Args struct {        A, B int}type Arith intfunc (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)}
第二個例子中的
newServer.HandleHTTP("/foo", "/bar") 
可以任意設定,第一個例子其實是設定了預設的兩個
 
這裡也順便將reply作為[]slice的例子給示範了下
 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.