服务端代码
HelloService.go
package main
import (
"net/rpc"
"net"
"log"
)
const HelloServiceName = "citi.com/api/HelloService"
type HelloService interface {
Hello(request string, reply *string) error
}
func RegisterHelloService(svc HelloService) error {
return rpc.RegisterName(HelloServiceName, svc)
}
type HelloServiceImpl struct {}
func (p *HelloServiceImpl) Hello(request string, reply *string) error {
*reply = "hello:" + request
return nil
}
func main() {
RegisterHelloService(new(HelloServiceImpl))
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
go rpc.ServeConn(conn)
}
}
客户端代码
HelloServiceClient.go
package main
import (
"net/rpc"
"log"
"fmt"
)
const HelloServiceName = "citi.com/api/HelloService"
type HelloServiceClient struct {
*rpc.Client
}
func DialHelloService(network, address string) (*HelloServiceClient, error) {
c, err := rpc.Dial(network, address)
if err != nil {
return nil, err
}
return &HelloServiceClient{Client: c}, nil
}
func (p *HelloServiceClient) Hello(request string, reply *string) error {
return p.Client.Call(HelloServiceName+".Hello", request, reply)
}
func main() {
client, err := DialHelloService("tcp", "localhost:1234")
if err != nil {
log.Fatal("dialing:", err)
}
var reply string
err = client.Hello("Abner", &reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
}