Ai
7 Star 23 Fork 31

go-course/go8

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
main.go 2.21 KB
一键复制 编辑 原始数据 按行查看 历史
Mr.Yu 提交于 2022-09-24 16:09 +08:00 . json on tcp
package main
import (
"fmt"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"gitee.com/go-course/go8/micro/rpc/json_tcp/service"
)
// 如何约束HelloService实现 HelloService接口
// var a1 service.HelloService = &HelloService{}
// 多个一个变量a1 --> _
// 多个一个值 &HelloService{} 多个一个开销, nil
// a1.(service.HelloService)
// (*HelloService)(nil) 表示的是一个*HelloService的nil (int32)(10) (*int32)(nil)
var _ service.HelloService = (*HelloService)(nil)
type HelloService struct{}
// hello(request)
// Greet函数的签名: 第一个参数Request 是string, 第二个参数是指针
// alice --->
// alice <-- hello alice
func (s *HelloService) Greet(request string, resp *string) error {
// 往指针内 塞入值
// *resp = "xxxx"
// StructA{}, 外出RPC框架层 感知不到该对象的变化(值和指针的区别)
*resp = fmt.Sprintf("hello, %s", request)
return nil
}
func main() {
// 把又给对象的方法暴露成一个RPC到网络上
// HelloService: RPC网络上 这个服务的名称, 类似于pkg名称
// &HelloService{}: 提供RPC方法实现的对象(Fn Greet)
// 客户端类似于这样来调用 HelloService.Greet()
//
// &HelloService{}: 的方法是需要约束, 约束了接口方式 Fn(request <T>, response<*T>) error
rpc.RegisterName("HelloService", &HelloService{})
// 已经注册需要暴露的RPC到RPC框架内, 需要设置RPC
// 使用net包(TCP/UPD), 来进行网络通信
// 然后我们建立一个唯一的TCP链接,
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
// 不断的从socket 读取报文, 然后处理, 如何处理交接给RPC框架
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
continue
}
// 把network交给RPC框架
// buf := bufio.NewWriter(conn)
// srv := &gobServerCodec{
// rwc: conn,
// dec: gob.NewDecoder(conn),
// enc: gob.NewEncoder(buf),
// encBuf: buf,
// }
// server.ServeCodec(srv)
// rcp.ServeCodec(srv)
// rpc框架为提供了基于Json的 服务端的编解码器: jsonrpc.ServerCodec
svc := jsonrpc.NewServerCodec(conn)
go rpc.ServeCodec(svc)
// go rpc.ServeConn(conn)
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/go-course/go8.git
git@gitee.com:go-course/go8.git
go-course
go8
go8
6a8978f41a84

搜索帮助