2019年12月

server

net/rpc
net/rpc/jsonrpc

"google.golang.org/grpc"

type Yqmiot int 

func (iot *Yqmiot) Report(req ReportRequest, resp *ReportRespone) error {

}

var yqmiot Yqmiot
rpc.Register(&yqmiot)
rpc.HandleHTTP()
http.ListenAndServe(":8000", nil)

client

r, err = rpc.DialHTTP("tcp", "localhost:8000")

var req ReportRequest
var resp ReportRespone
req.xxx = xxx
err = r.Call("Yqmiot.Report", req, &resp) 

参考资料:
https://studygolang.com/articles/14336

package main

import "net/http"

type MyHandler struct {
}

func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello world!"))
}

func main() {
    // 注册 uri 处理函数
    http.HandleFunc("/xxx", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("hello world!"))
    }
    // 开启 http 服务,并注册 handler 处理器
    http.ListenAndServe(":8000", &MyHandler{})
}

http 模块需要一个 handler (此 handler 需要实现 ServerHTTP 方法) 来处理 http请求,在开启 http 服务的时候没有提供 handler 则会使用默认 handler
(DefaultServeMux) 来处理。
http.HandleFunc 函数的作用是在 DefaultServeMux 注册对应 uri 的处理函数,此处理函数的定义和 ServerHTTP 一模一样。

func () ServeHTTP(w http.ResponseWriter, r *http.Request) {

}

1.安装 protoc-gen-go

go get github.com/golang/protobuf/protoc-gen-go

2.下载protoc

https://github.com/google/protobuf/releases

3.编译proto

protoc --proto_path=./proto --go_out=../go/ *.proto

4.使用方式

package main

import (
    "reflect"
    "yqmiot"

    proto "github.com/golang/protobuf/proto"
)

func main() {
    // 根据具体类型编码
    loginreq := yqmiot.LoginReq{}
    loginreq.Uid = proto.String("wameidemao")
    loginreq.Password = proto.String("woyouyizhixiaomaolv")
    data, _ := proto.Marshal(&loginreq)

    // 根据具体类型解码
    _ = proto.Unmarshal(data, &loginreq)

    // 根据类型名称解码
    messname := "yqmiot.LoginReq"
    messtype := proto.MessageType(messname).Elem() // 获取注册类型
    mess := reflect.New(messtype).Interface().(proto.Message)
    _ = proto.Unmarshal(data, mess)
}