第十二章 标准库——7.net包

一、引言

Go语言的net包提供了对网络和RPC(远程过程调用)编程的支持。通过net包,开发者可以创建HTTP服务、TCP服务器与客户端,以及实现RPC服务。本文将通过详细的示例,讲解如何使用net包进行这些操作。

二、创建HTTP服务
  1. 导入必要的包

    package main
    import "net/http"

  2. 定义处理器函数
    处理器函数是一个接受http.ResponseWriter和*http.Request参数的函数。http.ResponseWriter用于向客户端发送响应,而*http.Request包含了客户端的请求信息。

    var helloHandler = func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello world"))
    return
    }

  3. 注册处理器并启动服务
    使用http.HandleFunc注册处理器函数,然后使用http.ListenAndServe启动HTTP服务。

    func main() {
    http.HandleFunc("/hello", helloHandler)
    err := http.ListenAndServe("localhost:8080", nil)
    if err != nil {
    panic("error:" + err.Error())
    }
    }

  4. 测试服务
    启动服务后,可以使用curl命令测试:

    curl localhost:8080/hello

输出应为hello world。

三、创建RPC服务
  1. 定义服务类型和方法
    RPC服务需要定义一个服务类型,并为该类型定义可供远程调用的方法。

    package main
    import (
    "net"
    "net/rpc"
    )

    type UserService struct{}

    func (s *UserService) Say(request string, reply *string) error {
    *reply = "hi," + request
    return nil
    }

  2. 注册服务并启动RPC服务器
    使用rpc.RegisterName注册服务,然后使用net.Listen和listener.Accept创建TCP监听器,并使用rpc.ServeConn处理连接。

    func main() {
    var err error
    err = rpc.RegisterName("UserService", new(UserService))
    if err != nil {
    panic(err)
    }
    listener, err := net.Listen("tcp", ":8011")
    if err != nil {
    panic(err)
    }
    conn, err := listener.Accept()
    if err != nil {
    panic(err)
    }
    rpc.ServeConn(conn)
    }

四、创建RPC客户端
  1. 连接到RPC服务器并调用远程方法
    使用rpc.Dial连接到RPC服务器,然后使用client.Call调用远程方法。

    package main
    import (
    "fmt"
    "net/rpc"
    "testing"
    )

    func TestClient(t *testing.T) {
    client, err := rpc.Dial("tcp", "localhost:8011")
    if err != nil {
    panic(err)
    }
    var reply string
    err = client.Call("UserService.Say", "tom", &reply)
    if err != nil {
    panic(err)
    }
    fmt.Println(reply)
    }

  2. 运行测试
    将上述代码放入测试文件中(通常以_test.go结尾),然后使用go test运行测试。输出应为hi,tom。

五、总结

本文详细讲解了如何使用Go语言的net包创建HTTP服务和RPC服务。通过示例代码,读者可以了解到如何处理HTTP请求、如何定义和注册RPC服务以及如何创建RPC客户端并调用远程方法。这些知识点是Go语言网络编程的基础,希望对读者有所帮助。

相关推荐
飞鸟真人8 小时前
IM网关系列(九)单账号流量统计:滑动窗口桶方案设计与Go实现
后端·golang
紧跟先前的步伐11 小时前
Go AI Agent 实战 11|请求结构、响应结构与 JSON 解析
人工智能·ai·golang·json
利威尔xu13 小时前
Go IM 源码实战(2):WebSocket 握手 11 步,少 1 个参数连不上
后端·websocket·微服务·面试·golang
利威尔xu15 小时前
万字详解 | Go 进阶(二)GC 三色标记:STW 从 10ms 压到 40μs,1 次 Full GC 让线上 P99 抖了 3 秒
开发语言·后端·性能优化·golang·高并发
紧跟先前的步伐15 小时前
Go AI Agent 实战 12|HTTP 状态码、API 错误处理与日志
开发语言·人工智能·http·ai·golang
pan_junbiao16 小时前
Go语言中的空白标识符
开发语言·后端·golang
念何架构之路1 天前
go-grpc设计思想
开发语言·后端·golang
microrain1 天前
SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要
物联网·缓存·golang·sagooiot
喵了几个咪1 天前
GoWind ShortPlay 深度拆解:三服务 BFF + Core,一条请求的完整工程链路
golang·gowind