golang HTTP基础

server/2024/11/19 1:59:18/
http://www.w3.org/2000/svg" style="display: none;">

httpListenAndServe_0">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 mainimport ("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 函数处理。如果服务器成功启动,它会打印一条日志消息,并持续运行,直到被外部因素(如操作系统信号)终止。如果启动服务器时发生错误(例如,指定的端口已经被占用),函数会返回一个错误。

httpHandle_57">http.Handle

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

例子:

package mainimport ("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.ppmy.cn/server/143045.html

相关文章

室内定位论文精华-无人机与机器人在地下与室内环境中的自主导航与定位新技术

天文导航算法在低成本视觉系统中的应用 关键词 天文导航;自主无人机;GNSS拒止环境;稳定成像系统;星图识别;姿态估计;位置估算 研究问题 现代无人驾驶飞行器(UAV)中,很少使用天文学导航技术。传统的天文学导航依赖于稳定的成像系统,这不仅体积大且重量重,难以满足…

Linux:进程的优先级 进程切换

文章目录 前言一、进程优先级1.1 基本概念1.2 查看系统进程1.3 PRI和NI1.4 调整优先级1.4.1 top命令1.4.2 nice命令1.4.3 renice命令 二、进程切换2.1 补充概念2.2 进程的运行和切换步骤(重要) 二、Linux2.6内核进程O(1)调度队列(重要&#x…

<Project-23 Navigator Portal> Python flask web 网站导航应用 可编辑界面:添加图片、URL、描述、位置移动

目的: 浏览器的地址簿太厚,如下图: 开始,想给每个 Web 应用加 icon 来提高辨识度,发现很麻烦:create image, resize, 还要挑来挑去,重复性地添加代码。再看着这些密密麻麻的含有重复与有规则的…

HbuilderX 插件开发-模板创建

实现思路 使用HbuilderX 打开某个文档时右键点击的时候获取当前打开的文档内容使用 API 替换为自己的模板 示例 package.json {"id": "SL-HbuilderX-Tool","name": "SL-HbuilderX-Tool","description": "快速创建h…

微信小程序自定义顶部导航栏(适配各种机型)

效果图 1.pages.js,需要自定义导航栏的页面设置"navigationStyle": "custom" 2.App.vue,获取设备高度及胶囊位置 onLaunch: function () {// 系统信息const systemInfo uni.getSystemInfoSync()// 胶囊按钮位置信息const menuButtonInfo uni.…

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载

软件介绍 下载iOS旧版应用,简化繁琐的抓包流程。 一键生成去更新IPA(手机安装后,去除App Store的更新检测)。 软件界面 支持系统 Windows 10/Windows 8/Windows 7(由于使用了Fiddler库,因此需要.Net环境…

excel-VLOOKUP函数使用/XVLOOKUP使用

多个窗口同时编辑表格,方便对照操作 使用开始-视图-新建窗口 将战区信息表的三列数据匹配到成交数据表上 可以使用VLOOKUP函数 有4个参数(必须要查找的值, 要查找的区域,要返回区域的第几列数据,一个可选参数查找匹…

android studio new flutter project-运行第一个flutter项目

android studio new flutter project win10系统,由于之前尝试学习RN的时候已经安装了android studio 所以在尝试运行Flutter项目省去了一些步骤 这里说一下如何在android studio创建第一个flutter project 下载flutter sdk 到 https://docs.flutter.cn/release/a…