Created
February 3, 2021 17:11
-
-
Save hunter32292/8278efa24bd33edfd1d8ee8fb17cdb43 to your computer and use it in GitHub Desktop.
Example of RPC with golang
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"errors" | |
"log" | |
"net" | |
"net/rpc" | |
"strconv" | |
"sync" | |
"time" | |
) | |
// Response - the response object | |
type Response struct { | |
Message string | |
} | |
// Request - the RPC request object | |
type Request struct { | |
Name string | |
} | |
// Handler - the struct to hold the handlers for the requests | |
type Handler struct { | |
Name string | |
} | |
func (h *Handler) Execute(req Request, res *Response) (err error) { | |
if req.Name == "" { | |
err = errors.New("A name must be specified") | |
return | |
} | |
res.Message = "Hello " + req.Name | |
return | |
} | |
var ( | |
HandlerName = "Handler" | |
port = 8080 | |
addr = "127.0.0.1:" + strconv.Itoa(port) | |
request = &Request{Name: "John"} | |
response = new(Response) | |
) | |
func main() { | |
log.Println("Starting...") | |
var wg sync.WaitGroup | |
wg.Add(1) | |
go func() { | |
defer wg.Done() | |
Server() | |
}() | |
time.Sleep(time.Second) | |
wg.Add(1) | |
go func() { | |
defer wg.Done() | |
Client() | |
}() | |
wg.Wait() | |
} | |
func Client() { | |
log.Println("Starting Client") | |
client, err := rpc.Dial("tcp", addr) | |
if err != nil { | |
log.Fatal(err) | |
} | |
defer client.Close() | |
log.Println("Client Dial ", addr) | |
// Call the specific method in handler name | |
err = client.Call(HandlerName+".Execute", request, response) | |
if err != nil { | |
log.Fatal(err) | |
} | |
log.Println(response.Message) | |
} | |
func Server() { | |
log.Println("Starting Server") | |
server := rpc.NewServer() | |
err := server.RegisterName(HandlerName, &Handler{}) | |
if err != nil { | |
log.Fatal(err) | |
} | |
log.Println("Register Handler ") | |
listener, err := net.Listen("tcp", addr) | |
if err != nil { | |
log.Fatal(err) | |
} | |
log.Println("Listen on port ", port) | |
defer listener.Close() | |
for { | |
server.Accept(listener) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment