使用golang官方库net/rpc
服务端
package main
import (
"fmt"
"log"
"net"
"net/http"
"net/rpc"
"os"
)
type Rectangle struct {
}
type RectangleRequest struct {
Length int
Width int
}
type RectangleResponse struct {
Area int
Perimeter int
}
func (this *Rectangle) Area(req RectangleRequest, res *RectangleResponse) error {
res.Area = req.Length * req.Width
return nil
}
func (this *Rectangle) Perimeter(req RectangleRequest, res *RectangleResponse) error {
res.Perimeter = 2 * (req.Length + req.Width)
return nil
}
func main() {
rpc.Register(new(Rectangle))
rpc.HandleHTTP()
lis, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatalln("fatal error: ", err)
}
fmt.Fprintf(os.Stdout, "%s", "start connection")
http.Serve(lis, nil)
}
客户端调用
package main
import (
"fmt"
"log"
"net/rpc"
)
type Rectangle struct {
A int
B int
}
type RectangleRequest struct {
Length int
Width int
}
type RectangleResponse struct {
Area int
Perimeter int
}
func main() {
conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatalln("dialing error: ", err)
}
req := RectangleRequest{9, 2}
var res RectangleResponse
err = conn.Call("Rectangle.Area", req, &res)
if err != nil {
log.Fatalln("arith error: ", err)
}
fmt.Printf("%d * %d = %d\n", req.Length, req.Width, res.Area)
err = conn.Call("Rectangle.Perimeter", req, &res)
if err != nil {
log.Fatalln("arith error: ", err)
}
fmt.Printf("lenght:%d width:%d, perimeter is %d,\n", req.Length, req.Width, res.Perimeter)
}