# 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)
}
```