Solution 1: Working with gRPC
Let’s solve the challenge set in the previous lesson.
We'll cover the following...
Solution
Following is the updated gClient.go
code converted to a command-line utility using cobra
. To run the client side, open a new terminal window and execute the following commands:
export GOROOT=/usr/local/go; export GOPATH=$HOME/go; export PATH=$GOPATH/bin:$GOROOT/bin:$PATH;cd /usercodego build gClient.go./gClient --port=localhost:8080
package main import ( "context" "fmt" "math/rand" "net" "os" "time" "github.com/Educative-Content/protoapi" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) var min = 0 var max = 100 func random(min, max int) int { return rand.Intn(max-min) + min } // Extra function for creating secure random numbers // // func randomSecure(min, max int) int { // v, err := rand.Int(rand.Reader, big.NewInt(int64(max))) // if err != nil { // fmt.Println(err) // return min // } // fmt.Println("**", v, min, max) // return min + int(v.Uint64()) // } func getString(len int64) string { temp := "" startChar := "!" var i int64 = 1 for { // For getting valid ASCII characters myRand := random(0, 94) newChar := string(startChar[0] + byte(myRand)) temp = temp + newChar if i == len { break } i++ } return temp } type RandomServer struct { protoapi.UnimplementedRandomServer } func (RandomServer) GetDate(ctx context.Context, r *protoapi.RequestDateTime) (*protoapi.DateTime, error) { currentTime := time.Now() response := &protoapi.DateTime{ Value: currentTime.String(), } return response, nil } func (RandomServer) GetRandom(ctx context.Context, r *protoapi.RandomParams) (*protoapi.RandomInt, error) { rand.Seed(r.GetSeed()) place := r.GetPlace() temp := random(min, max) for { place-- if place <= 0 { break } temp = random(min, max) } response := &protoapi.RandomInt{ Value: int64(temp), } return response, nil } func (RandomServer) GetRandomPass(ctx context.Context, r *protoapi.RequestPass) (*protoapi.RandomPass, error) { rand.Seed(r.GetSeed()) temp := getString(r.GetLength()) response := &protoapi.RandomPass{ Password: temp, } return response, nil } var port = ":8080" func main() { if len(os.Args) == 1 { fmt.Println("Using default port:", port) } else { port = os.Args[1] } server := grpc.NewServer() var randomServer RandomServer protoapi.RegisterRandomServer(server, randomServer) reflection.Register(server) listen, err := net.Listen("tcp", port) if err != nil { fmt.Println(err) return } fmt.Println("Serving requests...") server.Serve(listen) }
gServer.go and gClient.go
Code explanation
The following changes have been ...