goalng rpc

server

go
package main

import (
    "log"
    "net"
    "net/rpc"
)

// 作為rpc的server func,必須接受兩個參數 (duck typing) (request string, reply *string)
// 另外返回值為error,必須為公開的方法

type HelloService struct{}

func (h *HelloService) Hello(request string, reply *string) error {
    *reply = "hello: " + request
    return nil
}

func main() {
    // rpc.Register會將object中所有滿足rpc規則的方法註冊為rpc函數
    // 所有註冊的方法會被放在HelloService服務空間下。
    rpc.RegisterName("HelloService", new(HelloService))

    // 建立聆聽一個tcp連線,
    listner, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatal(err)
    }
    for {
        conn, err := listner.Accept()
        if err != nil {
            log.Fatal(err)
        }

        // rpc.ServeConn在該連線上提供client rpc函數
        go rpc.ServeConn(conn)
    }
}

client

go
package main

import (
    "fmt"
    "log"
    "net/rpc"
)

func main() {
    // rpc.Dial 連接該rpc服務
    conn, err := rpc.Dial("tcp", ":8080")
    if err != nil {
        log.Fatal(err)
    }

    var reply string
    // 透過conn.Call來使用rpc方法。
    // conn.Call(serviceMethod, args, reply)
    conn.Call("HelloService.Hello", "Jack", &reply)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(reply)
}