【Go语言快速上手】第二部分:Go语言进阶之网络编程

文章目录

  • 前言:网络编程
  • 一、TCP/UDP 编程:`net` 包的使用
    • 1. TCP 编程
      • 1.1 TCP 服务器
      • 1.2 TCP 客户端
    • 2. UDP 编程
      • 2.1 UDP 服务器
      • 2.2 UDP 客户端
  • 二、HTTP 编程:`net/http` 包的使用,编写 HTTP 服务器和客户端
    • 2.1 HTTP 服务器
    • 2.2 HTTP 客户端
  • 三、WebSocket 编程:`gorilla/websocket` 包的使用
    • 3.1 WebSocket 服务器
    • 3.2 WebSocket 客户端

前言:网络编程

Go 语言提供了强大的网络编程能力,支持 TCP/UDP 协议的开发、HTTP 服务的构建,以及 WebSocket 协议的支持。通过内置的 netnet/http 包,Go 使得网络编程变得简洁高效。我们也可以使用第三方库,如 gorilla/websocket 来简化 WebSocket 的使用。

一、TCP/UDP 编程:net 包的使用

Go 的 net 包提供了多种方法来处理 TCP 和 UDP 网络编程。你可以通过它创建网络连接、发送和接收数据。

1. TCP 编程

TCP 是面向连接的协议,它保证数据的可靠传输。在 Go 中,可以使用 net 包提供的 DialListen 方法来建立 TCP 客户端和服务器。

1.1 TCP 服务器

package mainimport ("fmt""net""log"
)func handleConnection(conn net.Conn) {fmt.Println("Client connected:", conn.RemoteAddr())defer conn.Close()conn.Write([]byte("Hello, client!"))
}func main() {// 创建 TCP 监听listener, err := net.Listen("tcp", ":8080")if err != nil {log.Fatal(err)}defer listener.Close()fmt.Println("Server is listening on port 8080...")for {conn, err := listener.Accept() // 接受客户端连接if err != nil {log.Fatal(err)}go handleConnection(conn) // 为每个连接启动一个 goroutine 处理}
}

1.2 TCP 客户端

package mainimport ("fmt""net""log"
)func main() {// 创建 TCP 客户端连接conn, err := net.Dial("tcp", "localhost:8080")if err != nil {log.Fatal(err)}defer conn.Close()// 接收并打印服务器返回的消息buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {log.Fatal(err)}fmt.Println("Server says:", string(buffer[:n]))
}

2. UDP 编程

UDP 是无连接的协议,传输速度较快,但不保证数据的可靠性。在 Go 中,使用 net 包提供的 ListenUDPDialUDP 方法来处理 UDP 通信。

2.1 UDP 服务器

package mainimport ("fmt""net""log"
)func main() {// 创建 UDP 监听地址addr, err := net.ResolveUDPAddr("udp", ":8080")if err != nil {log.Fatal(err)}conn, err := net.ListenUDP("udp", addr)if err != nil {log.Fatal(err)}defer conn.Close()buffer := make([]byte, 1024)for {n, clientAddr, err := conn.ReadFromUDP(buffer)if err != nil {log.Fatal(err)}fmt.Println("Received:", string(buffer[:n]), "from", clientAddr)}
}

2.2 UDP 客户端

package mainimport ("fmt""net""log"
)func main() {// 创建 UDP 目标地址serverAddr, err := net.ResolveUDPAddr("udp", "localhost:8080")if err != nil {log.Fatal(err)}// 创建 UDP 连接conn, err := net.DialUDP("udp", nil, serverAddr)if err != nil {log.Fatal(err)}defer conn.Close()// 发送数据message := []byte("Hello, UDP server!")_, err = conn.Write(message)if err != nil {log.Fatal(err)}fmt.Println("Message sent to server")
}

二、HTTP 编程:net/http 包的使用,编写 HTTP 服务器和客户端

Go 语言的 net/http 包提供了简单而强大的 HTTP 服务器和客户端功能。通过该包,你可以很容易地编写 HTTP 服务器,并与 HTTP 客户端进行通信。

2.1 HTTP 服务器

Go 提供了非常简洁的方式来构建 HTTP 服务器。你只需要实现处理请求的函数,并通过 http.HandleFunc 注册路由,然后调用 http.ListenAndServe 启动服务器。

package mainimport ("fmt""net/http"
)func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}func main() {http.HandleFunc("/hello", helloHandler) // 注册路由fmt.Println("Starting server on :8080...")http.ListenAndServe(":8080", nil) // 启动 HTTP 服务器
}

在这个示例中,HTTP 服务器会监听 8080 端口,并且在请求 /hello 路径时返回 Hello, World!

2.2 HTTP 客户端

Go 语言的 http 包也提供了简单的方式来发起 HTTP 请求。你可以使用 http.Gethttp.Post 等方法发起请求,并接收返回的响应。

package mainimport ("fmt""net/http""log"
)func main() {// 发起 GET 请求resp, err := http.Get("http://localhost:8080/hello")if err != nil {log.Fatal(err)}defer resp.Body.Close()// 打印响应状态和内容fmt.Println("Response Status:", resp.Status)
}

在这个示例中,客户端发起一个 GET 请求,访问服务器的 /hello 路径,获取服务器的响应。


三、WebSocket 编程:gorilla/websocket 包的使用

WebSocket 是一种在单个连接上进行全双工通信的协议。Go 中可以使用第三方库 gorilla/websocket 来实现 WebSocket 服务端和客户端。

3.1 WebSocket 服务器

首先,你需要安装 gorilla/websocket 包:

go get github.com/gorilla/websocket

然后,编写 WebSocket 服务器:

package mainimport ("fmt""log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true },
}func handleConnection(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println(err)return}defer conn.Close()for {messageType, p, err := conn.ReadMessage()if err != nil {log.Println(err)return}if err := conn.WriteMessage(messageType, p); err != nil {log.Println(err)return}}
}func main() {http.HandleFunc("/ws", handleConnection)fmt.Println("WebSocket server is running on :8080...")log.Fatal(http.ListenAndServe(":8080", nil))
}

3.2 WebSocket 客户端

WebSocket 客户端同样也可以使用 gorilla/websocket 包来连接到 WebSocket 服务器。

package mainimport ("fmt""log""github.com/gorilla/websocket"
)func main() {// 连接到 WebSocket 服务器conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)if err != nil {log.Fatal(err)}defer conn.Close()message := []byte("Hello, WebSocket server!")err = conn.WriteMessage(websocket.TextMessage, message)if err != nil {log.Fatal(err)}_, response, err := conn.ReadMessage()if err != nil {log.Fatal(err)}fmt.Println("Received from server:", string(response))
}

在这个示例中,WebSocket 客户端连接到 WebSocket 服务器并发送消息,然后等待服务器的响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

王炸 用AI+飞书 分解 一键生成 项目计划表模版

效果图: 各字段设置: 以下是一个使用 AI(DeepSeeker) 飞书多维表格分解项目待办模板的示例,你可以根据实际情况进行调整和优化: 列表中需要选择对象,且选择输出结果(记得控制字符长度…

从月牙定理看古希腊数学的奇妙突破

文章目录 每日一句正能量前言古希腊人的 “化圆为方” 之梦(一)几何作图的基本规则(二)化圆为方问题的起源与发展(三)化圆为方的意义 月牙面积定理的诞生(一)希波克拉底的生平与成就…

实战:vLLM多机多卡部署大模型

两台服务器 1. Docker容器中使用GPU 必须确保已安装并配置 NVIDIA Docker。你可以安装 nvidia-docker 来确保 GPU 驱动能够被 Docker 使用 #安装 nvidia-docker: sudo apt-get install nvidia-docker2#然后重启 Docker: sudo systemctl restart docke…

LLM中种子(Seed)作用是什么:多样性

LLM中种子(Seed)作用是什么:多样性 目录 LLM中种子(Seed)作用是什么:多样性作用举例不同种子的区别设置不同种子的原因在LLM(大语言模型)中,种子(Seed)用于初始化随机数生成器,发挥着确保结果可重复性的关键作用,具体如下: 作用 当大语言模型生成文本时,很多操…

neo4j二进制部署

neo4j二进制部署 下载所需组件 jdk 17 neo4j 5.2.0 配置文件 server.default_listen_address0.0.0.0环境变量 export JAVA_HOME/usr/local/jdk-17.0.13 export CLASSPATH.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH$…

Win10环境使用零讯ZeroNews内网穿透实现Deepseek对外服务

Win10环境使用零讯ZeroNews内网穿透实现Deepseek对外服务 前言 之前笔者已经在Win10环境搭建好了Ollama、DeepSeek、Open WebUI、Dify等组件,成功实现了私有化部署及内网访问: https://lizhiyong.blog.csdn.net/article/details/145505686 https://l…

spconv 安装测试

pip install spconv 报错: File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1736, in _wrapped_call_impl return self._call_impl(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/mod…

MySQL 查询缓存技术深度解析

在现代数据库管理系统中,查询性能优化是提升应用响应速度和用户体验的关键环节。MySQL 作为一款广泛使用的开源关系型数据库,提供了查询缓存功能,用于缓存查询结果,从而在后续相同的查询请求时能够快速返回结果,减少数…

halcon 条形码、二维码识别、opencv识别

一、条形码 函数介绍 create_bar_code_model * 1.创建条码读取器的模板 * 参数一:通用参数的名称,针对条形码模型进行调整。默认值为空 * 参数二:针对条形码模型进行调整 * 参数三:条形码模型的句柄。 create_bar_code_model (…

一个简洁高效的Flask用户管理示例

Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。 适用于: • 用户登录、登出 • 记住用户(“记住我” 功能) • 限制未登录用户访问某些页面 • 用户会话管理 1. 安装 Flask-Login pi…

HashSet 的底层原理(简单易懂)

在 Java 集合框架中,HashSet 是一个非常常用的集合类,它提供了快速的元素查找和插入操作。那么,HashSet 的底层是如何实现这些高效操作的呢?本文将深入探讨 HashSet 的底层原理。 一、HashSet 的基本概念 HashSet 是基于哈希表的…

【学习资源】时间序列数据分析方法(2)-mWDN和AutoEncoder

接着上次的【学习资源】时间序列数据分析方法(1)-CSDN博客,本次介绍mWDN和AutoEncoder 解决时序数据分类的方法。介绍模型原理、应用场景和参考代码。也从模型性能、训练效率、模型复杂度、计算复杂度、可解释性、适应性和泛化能力、健壮性、…

[LeetCode力扣hot100]-链表

相交链表 160. 相交链表 - 力扣(LeetCode) 思路就是遍历两个链表,有相同的部分就可以视为相交。 但是长度不一样,比如两个会相交的链表,headA 的长度为 a c,headB 的长度为 b c,其中 c 是公…

JAVA EE初阶 - 预备知识(四)

一、API API 即应用程序编程接口(Application Programming Interface),是一组定义、协议和工具,用于不同软件组件、应用程序或系统之间进行交互和通信。以下从多个方面详细介绍 API: 基本概念 接口规范:A…

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收 文章目录 系统延时GPIO配置GPIO输出SCI配置SCI发送、接收测试附录:F28002x开发板上手、环境配置、烧录及TMS320F280025C模板工程建立F28002x叙述烧录SDK库文件说明工程建…

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作(Ollama 工具介绍与下载)2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…

期权隐含波动率是什么意思?

财顺小编本文主要介绍期权隐含波动率是什么意思?期权隐含波动率(Implied Volatility)是根据当前期权市场价格,利用期权定价模型(如Black-Scholes模型)推导出的关于合约标的理论上的价格波动率。它反映了市场…

Python 面向对象的三大特征

前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…

Jmeter如何计算TPS

1.在jmeter中计算出接口请求的个数 1175 1172 1172 174 200 416 384 1174 5867 2.计算接口平均响应时间 计算每个接口的请求次数乘以平均响应时间,所有接口相加,然后除以所有接口的数量总和,得到接口的平均响应时间 (1175*18191172*…

github上文件过大无法推送问题

GitHub 对文件大小有限制,超过 100 MB 的文件无法直接推送到仓库中。 解决思路: 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS: 1. 安装 Git LFS 首先,你需要安装 Git LFS。可以按照以…