代码拉取完成,页面将自动刷新
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)
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。