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

golang HTTP基础

http.ListenAndServe

http.ListenAndServe 是 Go 语言标准库 net/http 包中的一个函数,用于启动一个 HTTP 服务器并监听指定的端口,以便接收和处理来自客户端的 HTTP 请求。这个函数是构建 Web 服务器和 Web 服务的基础。

函数签名

func ListenAndServe(address string, handler Handler) error

参数
address:一个字符串,指定服务器监听的网络地址和端口。通常格式为 “host:port”,例如 “:8080” 表示监听所有可用网络接口上的 8080 端口。如果省略 host 部分,默认监听所有网络接口**(即 0.0.0.0)。

handler:一个实现了 http.Handler 接口的值,用于处理传入的 HTTP 请求。http.Handler 是一个接口,包含一个方法 ServeHTTP(ResponseWriter, *Request),用于处理 HTTP 请求。如果传递 nil,则默认使用 http.DefaultServeMux,这是一个多路复用器,它将 URL 路径映射到对应的处理器。

返回值
函数返回一个 error 类型,如果服务器成功启动并开始监听,则返回 nil。如果启动服务器时发生错误(例如,指定的端口已经被占用),函数会返回一个错误。

工作流程

  • 监听端口:服务器尝试在指定的地址和端口上监听 TCP 连接。
  • 接收连接:一旦监听成功,服务器会无限循环等待客户端的连接。
  • 处理请求:对于每个接收到的连接,服务器会创建一个 http.Request 对象来表示请求,并使用提供的 handler 来处理这个请求。如果 handler 是 nil,则使用默认的多路复用器 http.DefaultServeMux。
  • 发送响应:处理器处理请求后,会通过 http.ResponseWriter 发送响应给客户端。
  • 循环处理:服务器会持续这个过程,直到发生错误或被外部信号中断。

例子:

package main

import (
    "fmt"
    "log"
    "net/http"
)

// 定义一个处理器函数
func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
}

func main() {
    // 使用 http.HandleFunc 注册 URL 路径和处理器函数
    http.HandleFunc("/", myHandler)

    // 启动 HTTP 服务器
    log.Println("Starting server on port 8080...")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

在这个例子中,我们定义了一个名为 myHandler 的处理器函数,它简单地向客户端返回 “Hello, World!”。然后我们使用 http.HandleFunc 将根 URL 路径(“/”)与 myHandler 函数关联起来。最后,我们调用 http.ListenAndServe 来启动服务器,监听 8080 端口。

当服务器运行时,任何对服务器根路径的 HTTP GET 请求都会被 myHandler 函数处理。如果服务器成功启动,它会打印一条日志消息,并持续运行,直到被外部因素(如操作系统信号)终止。如果启动服务器时发生错误(例如,指定的端口已经被占用),函数会返回一个错误。

http.Handle

  • 当你调用 http.Handle 时,你实际上是在向 http.DefaultServeMux 注册一个路由和对应的处理器。
  • 当你调用 http.ListenAndServe 时,如果传入 nil 作为处理器,那么它会使用 http.DefaultServeMux 来处理请求;如果你传入了一个自定义的 http.ServeMux 实例,那么它会使用这个自定义的实例来处理请求。

例子:

package main

import (
	"fmt"
	"net/http"
	"testing"
)

func TestHTTP(t *testing.T) {

	http.Handle("/api", http.HandlerFunc(
		func(w http.ResponseWriter, r *http.Request) {
			fmt.Fprintln(w, "hello world")
		}))

	go http.ListenAndServe("localhost:8080", nil)
	go http.ListenAndServe("localhost:8081", nil)

	select {}
}
  • 其中访问localhost:8080/api和localhost:8080/api都会显示"hello world"
  • select {}是为了使主进程阻塞,让服务器持续提供服务
  • 多个http.ListenAndServe会阻塞,需要在不同goroutine上异步运行

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

相关文章:

  • 散斑/横向剪切/迈克尔逊/干涉条纹仿真技术分析
  • C++的内存四区
  • 详细解读SAQ评级
  • 【VUE小型网站开发】socket.io聊天室
  • linux安装字体(亲测)
  • OpenCV学习——图像融合
  • 【计网】实现reactor反应堆模型 --- 多线程方案优化 ,OTOL方案
  • C++算法练习-day39——654.最大二叉树
  • flutter下拉刷新上拉加载的简单实现方式三
  • 实习冲刺第二十一天
  • 手机怎么玩steam游戏?随时随地远程串流玩steam游戏教程
  • 【JavaWeb】JavaWeb入门之XML详解
  • 【MATLAB】目标检测初探
  • eBay接受支付宝付款!卖家如何接住新流量?
  • Node.js版本管理工具nvm使用教程
  • Scala的Array
  • 2.6 以太网扩展技术
  • 实验6记录网络与故障排除
  • 大模型时代,呼叫中心的呼入机器人系统如何建设?
  • 【蓝牙协议栈】【BLE】【IAS】蓝牙立即警报服务
  • Flink Job更新和恢复
  • 生产模式打包
  • Spring框架之装饰者模式 (Decorator Pattern)
  • 数据库SQL——函数依赖
  • python基础大杂烩
  • 机器学习 贝叶斯公式