首页 > 其他分享 >go rpc

go rpc

时间:2022-10-10 21:23:29浏览次数:37  
标签:string err fmt request json Println rpc go

  server.go

package main

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

type RpcTest struct {
}
type Result struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data map[string]interface{} `json:"data"`
}

func (r *RpcTest) HelloWorld(request map[string]interface{}, resp *string) error {
//fmt.Println(request["name"].(string))
//fmt.Println(request["age"].(int))
//*resp = request["name"].(string) + "您好" + strconv.Itoa(request["age"].(int))
var result Result
result.Code = 200
result.Msg = "ok"
result.Data = request
strResult, err := json.Marshal(result)
if err != nil {
fmt.Println("json错误")
}
*resp = string(strResult)
return nil
}

//主函数
func main() {
err := rpc.RegisterName("hello", new(RpcTest))
if err != nil {
fmt.Println("注册rpc服务失败")
}
listener, err := net.Listen("tcp", "127.0.0.1:8080")
defer listener.Close()
if err != nil {
fmt.Println("创建listener 失败")
}
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("创建链接失败")
}
fmt.Println("创建链接成功")
go func(conn net.Conn) {
jsonrpc.ServeConn(conn)
conn.Close()
}(conn)
}

}

client.go

package main

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

type Result struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data map[string]interface{} `json:"data"`
}

func main() {
conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println(err)
}
var result string
var request = make(map[string]interface{})
request["name"] = "张三"
request["age"] = 10
defer conn.Close()
err = conn.Call("hello.HelloWorld", request, &result)
if err != nil {
fmt.Println(err)
fmt.Println("远程调用失败")
}
var response Result
json.Unmarshal([]byte(result), &response)
fmt.Println(response.Code, response.Msg, response.Data["age"], response.Data["name"])
}



标签:string,err,fmt,request,json,Println,rpc,go
From: https://www.cnblogs.com/paulversion/p/16777403.html

相关文章

  • (转)如何在Category类中定义成员变量
    OC是不能直接修改对象的结构体的成员变量属性,一般做法是先取出对象的结构体变量,修改该取出来的结构体变量里面的成员,再把结构体对象赋值给原来的结构体变量,在UI中为了简......
  • Go Micro介绍与入门
    一什么是Micro?Micro是一个微服务生态系统,致力于提供产品,服务和解决方案,以实现现代软件驱动型企业的创新。我们计划成为任何与微服务相关的事实资源,并期待公司能够利用这......
  • Go语言的接口和Rust的Trait的对比
    go语言的接口是鸭子的方式,即struct本身拥有的方法如果包含某个接口里定义的所有方法声明,则认为这个struct实现了该接口,举例子:typeAstruct{Faceint}//A结构体......
  • 浅谈Go1.18版本新特性——泛型
    泛型Generics:引入了对使用参数化类型的泛型代码的新支持,达到了算法可复用的目的。两数求和,泛型函数的使用假设我们要计算两个数的和,函数可以这样子写funcAdd(a......
  • 玩转Go反射
    反射反射常用于各种框架类当中,它可以做到十分优雅的帮我们读取值、设置值Go语言当中感觉很多反射的工具类,比如Java中的hutool,并没有很好的支持我总结下来反射可以分为两......
  • SIT221 Data Structures and Algorithms课程辅导task1.1
    文章目录​​1.如何使用vector​​​​2.代码结构分析​​​​2.1类和对象​​​​2.2和原版本对比查看差距​​实现一个vector。1.如何使用vector2.代码结构分析总体......
  • 30 Django分页组件
    pager.py:"""如果想要使用分页,需要以下两个步骤defxxx():queryset=models.Customer.objects.filter(active=1).select_related('level','creator')#select......
  • go查看某段ip是否通的脚本
    go查看某段ip是否通的脚本例1:packagemainimport("fmt""golang.org/x/text/encoding/simplifiedchinese""os/exec""strings""sync")funcping......
  • Go_Channel详解
    一channel介绍单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。虽然可以使用共享内存进行数据交换,但是共享内存在不同的gorou......
  • Go_IO操作
    1.输入输出的底层原理终端其实是一个文件,相关实例如下:os.Stdin:标准输入的文件实例,类型为*Fileos.Stdout:标准输出的文件实例,类型为*Fileos.Stderr:标准错误输出的文件实......