Solution 1: Working with gRPC
Let’s solve the challenge set in the previous lesson.
We'll cover the following...
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 ...