GeeRPC第一天 序列化与反序列化(遇到的问题)

本文介绍了如何在Windows环境下使用Go语言的geerpc库进行客户端和服务端的序列化与反序列化操作,包括启动服务器、连接客户端以及使用json和GobCodec编码/解码数据。
摘要由CSDN通过智能技术生成

根据下面这张图可以知道,客户端和服务端对报文进行了序列化与反序列化。具体过程可以看代码。
在这里插入图片描述
问题一:windows环境编译会出现,错误因此,在终端输入下面的命令行

go run .\main.go

问题二补充main.go的解释

package main

import (
	"encoding/json"
	"fmt"
	"geerpc"
	"geerpc/codec"
	"log"
	"net"
	"time"
)

func startServer(addr chan string) {
	// pick a free port
	l, err := net.Listen("tcp", ":0")
	if err != nil {
		log.Fatal("network error:", err)
	}
	log.Println("start rpc server on", l.Addr())
	addr <- l.Addr().String()
	geerpc.Accept(l)
}

func main() {
	addr := make(chan string)
	go startServer(addr)

	// in fact, following code is like a simple geerpc client
	conn, _ := net.Dial("tcp", <-addr)
	defer func() { _ = conn.Close() }()

	time.Sleep(time.Second)
	// send options
	_ = json.NewEncoder(conn).Encode(geerpc.DefaultOption)
	cc := codec.NewGobCodec(conn)
	// send request & receive response
	for i := 0; i < 5; i++ {
		h := &codec.Header{
			ServiceMethod: "Foo.Sum",
			Seq:           uint64(i),
		}
		_ = cc.Write(h, fmt.Sprintf("geerpc req %d", h.Seq))
		_ = cc.ReadHeader(h)
		var reply string
		_ = cc.ReadBody(&reply)
		log.Println("reply:", reply)
	}
}
  1. net.Dial()用来返回一个net.Conn实例
  2. go startServer(addr)创建了一个net.Listen协程,l.Addr().String()会写入addr 通道,net.Dial(“tcp”, <-addr)一旦收到监听到的地址,就返回一个net.Conn 接口的实例
  3. json.NewEncoder(conn).Encode(geerpc.DefaultOption) 先是创建了一个 json.NewEncoder(conn) json编码器,然后定义geerpc.DefaultOption的编码方式。
  4. cc := codec.NewGobCodec(conn) 将conn读入buff中并返回cc结构体
  5. cc.Write(h, fmt.Sprintf(“geerpc req %d”, h.Seq)) 写入cc,相当于客户端发送enc.Encode(h)enc.Encode(body) 的消息头和消息体到服务端,ReadHeader 读消息头,根据消息头对消息体进行解码
    参考代码可见:

https://geektutu.com/post/geerpc-day1.html

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值