RPC
尚硅谷Golang課

server

/ 用接口,讓服務端註冊RPC的時候,就能確保他合法

type World struct{}

func (w *World) HelloWorld(name string, resp *string) error {
	*resp = name + "你好"
	return nil
	// 如果這個return的返回值不為空,
	// 那無論傳出的參數是否有值,服務端都不會給東西
	// (就你給你error)
}

// 用接口,讓服務端註冊RPC的時候,就能確保他合法
type MyInerface interface {
	HelloWorld(string *string) error
}

// 調用方法時,給i傳參,參數是實現HelloWorld方法的對象
func RegsiterService(i MyInerface) {
	rpc.RegisterName("hello", i)
}
func main() {
	// 1.註冊RPC服務 綁定對象方法
	err := rpc.RegisterName("hello", new(World))
	if err != nil {
		fmt.Println("註冊RPC服務失敗", err)
	}

	// 2.開始監聽
	listener, err := net.Listen("tcp", "127.0.0.1:8899")
	if err != nil {
		fmt.Println("listener failed", err)
		return
	}
	fmt.Println("server開始監聽...")
	defer listener.Close()
	// 3.建立連接
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("Accept failed", err)
		return
	}
	fmt.Println("連接成功")
	defer conn.Close()
	// 4.綁訂服務
	jsonrpc.ServeConn(conn)
}

client

import (
	"fmt"
	"net/rpc"
	"net/rpc/jsonrpc"
)

func main01() {
	// 1.用RPC連接伺服器
	// conn, err := rpc.Dial("tcp", "127.0.0.1:8899")
	conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8899")
	if err != nil {
		fmt.Println("Accept failed", err)
		return
	}
	defer conn.Close()
	// 2.遠程調用函數
	var reply = ""
	err = conn.Call("hello.HelloWorld", "張三", &reply)
	if err != nil {
		fmt.Println("Call failed", err)
		return
	}
	fmt.Println(reply)
}

func main() {
	// myClient := InitClient("127.0.0.1:8899")
	// var resp string
	// err := myClient.HelloWorld("李四", &resp)
	// if err != nil {
	// 	fmt.Println("HelloWorld failed", err)
	// 	return
	// }
	// fmt.Println(resp, err)
}

type MyClient struct {
	c *rpc.Client
}

// 把c初始化下面才能調用
// func InitClient(addr string) {
// 	conn, _ := jsonrpc.Dial("tcp", addr)
// 	return MyClient{c: conn}
// }

func (m *MyClient) HelloWorld(a string, b *string) error {
	return m.c.Call("hello.HelloWorld", a, b)
}

上次修改於 2021-08-01

此篇文章的評論功能已經停用。