当前位置: 首页 > article >正文

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

一、引言

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

二、创建HTTP服务
  1. 导入必要的包
package main
import "net/http"
  1. 定义处理器函数
    处理器函数是一个接受http.ResponseWriter*http.Request参数的函数。http.ResponseWriter用于向客户端发送响应,而*http.Request包含了客户端的请求信息。
var helloHandler = func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello world"))
    return
}
  1. 注册处理器并启动服务
    使用http.HandleFunc注册处理器函数,然后使用http.ListenAndServe启动HTTP服务。
func main() {
    http.HandleFunc("/hello", helloHandler)
    err := http.ListenAndServe("localhost:8080", nil)
    if err != nil {
        panic("error:" + err.Error())
    }
}
  1. 测试服务
    启动服务后,可以使用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
}
  1. 注册服务并启动RPC服务器
    使用rpc.RegisterName注册服务,然后使用net.Listenlistener.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)
}
  1. 运行测试
    将上述代码放入测试文件中(通常以_test.go结尾),然后使用go test运行测试。输出应为hi,tom
五、总结

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


http://www.kler.cn/a/500086.html

相关文章:

  • 【黑灰产】假钱包推广套路
  • 计算机网络(六)应用层
  • NLTK分词以及处理方法
  • 基于 JavaEE 的影视创作论坛
  • hive数据迁移
  • MySQL中的事务(如果想知道MYSQL中有关事务的知识,那么只看这一篇就足够了!)
  • python音乐播放器代码整理版
  • 大语言模型训练数据集格式
  • DeepSeek:性能强劲的开源模型
  • Redis集群模式下主从复制和哨兵模式
  • 深入学习 Python 爬虫:从基础到实战
  • git: hint:use --reapply-cherry-picks to include skipped commits
  • STM32如何使用内部晶振作为晶振
  • Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)
  • 【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用
  • docker 部署Nginx UI
  • 在UE5中使用视差贴图
  • 线程并发下的单例模式
  • 20_Spring Boot默认缓存管理
  • 【机器学习:七、分类问题】
  • 微服务电商平台课程六:后端代码框架认识
  • CI/CD与自动化运维的结合:加速交付与稳定运维
  • 联想java开发面试题及参考答案
  • 73.矩阵置零 python
  • 代码随想录算法训练营第3天(链表1)| 203.移除链表元素 707.设计链表 206.反转链表