go 的 net 包
目录
一、net包的基本功能
1.1 IP地址处理
1.2 网络协议支持
1.3 连接管理
二、net包的主要功能模块
2.1 IP地址处理
2.2 TCP协议
2.3 UDP协议
2.4 Listener和Conn接口
三、高级功能
3.1 超时设置
3.2 KeepAlive控制
3.3 获取连接信息
四、实际应用场景
4.1 Web服务器
4.2 实时通信
4.3 数据报送
Go语言的net
包是处理网络通信的核心库,它提供了底层的网络接口,包括TCP、UDP、IP等协议的支持。net
包的功能强大,使用灵活。
一、net包的基本功能
net
包主要用来处理网络通信,提供了包括IP地址处理、协议侦听、数据报送等功能。
1.1 IP地址处理
net
包中提供了IP
地址的解析、比较、检查等功能。IPAddress
接口定义了String()
、Netmask()
等方法,可以用来获取IP地址的字符串表示以及子网掩码。
1.2 网络协议支持
net
包支持多种网络协议,包括TCP、UDP、IP、Unix域套接字等。通过不同的协议,可以创建监听器(Listener)和连接(Conn)。例如,使用net.Listen("tcp", "localhost:8080")
可以创建一个TCP协议的监听器。
1.3 连接管理
net
包提供了Conn
接口,用来表示一个网络连接。通过Conn
接口可以进行数据的读写操作,同时也可以获取连接的本地和远程地址。
二、net包的主要功能模块
2.1 IP地址处理
net
包中IPAddress
接口提供了对IP地址的处理方法。例如,可以使用net.ParseIP()
函数解析一个IP地址字符串。
示例代码:
ip := net.ParseIP("192.168.1.1")
if ip != nil {fmt.Printf("IP address: %s\n", ip.String())
} else {fmt.Println("Invalid IP address")
}
2.2 TCP协议
TCP协议是面向连接的可靠协议,适合需要保证数据完整性的应用场景。net
包通过net/tcp
包提供了对TCP协议的支持。
TCP服务器示例:
listener, err := net.Listen("tcp", "localhost:8080")
if err != nil {log.Fatalf("Failed to listen: %v", err)
}for {conn, err := listener.Accept()if err != nil {log.Printf("Failed to accept connection: %v", err)continue}go handleConnection(conn)
}
TCP客户端示例:
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {log.Fatalf("Failed to dial: %v", err)
}
defer conn.Close()_, err = conn.Write([]byte("Hello, server!"))
if err != nil {log.Printf("Failed to write: %v", err)
}
2.3 UDP协议
UDP协议是无连接的不可靠协议,适合实时性要求高但对数据完整性不敏感的场景。net
包通过net/udp
包提供了对UDP协议的支持。
UDP服务器示例:
conn, err := net.ListenPacket("udp", ":8080")
if err != nil {log.Fatalf("Failed to listen: %v", err)
}
defer conn.Close()buf := make([]byte, 1024)
for {n, addr, err := conn.ReadFrom(buf)if err != nil {log.Printf("Failed to read: %v", err)continue}go handlePacket(buf[:n], addr)
}
UDP客户端示例:
conn, err := net.Dial("udp", "localhost:8080")
if err != nil {log.Fatalf("Failed to dial: %v", err)
}
defer conn.Close()_, err = conn.Write([]byte("Hello, server!"))
if err != nil {log.Printf("Failed to write: %v", err)
}
2.4 Listener和Conn接口
net
包中Listener
接口和Conn
接口是网络通信的核心接口。Listener
接口用于监听传入的连接,而Conn
接口则表示一个已建立的网络连接。
Listener接口方法:
Accept()
: 接受一个新的连接。Close()
: 关闭监听器。Addr()
: 获取监听器的地址。
Conn接口方法:
Read(b []byte)
: 从连接中读取数据。Write(b []byte)
: 向连接中写入数据。Close()
: 关闭连接。LocalAddr()
: 获取本地地址。RemoteAddr()
: 获取远程地址.
三、高级功能
3.1 超时设置
在网络通信中,超时设置用于防止因网络问题导致的长时间无响应。Go语言的net
包提供了多种方式设置超时。
示例代码:
// 设置连接超时
conn, err := net.DialTimeout("tcp", "localhost:8080", 5*time.Second)
if err != nil {log.Printf("Failed to dial: %v", err)
}
defer conn.Close()// 设置读写超时
conn.SetDeadline(time.Now().Add(10 * time.Second))
3.2 KeepAlive控制
在长时间没有数据传输的连接中,可能会因为网络设备的策略导致连接被关闭。net
包提供了SetKeepAlive
方法用于配置KeepAlive选项。
示例代码:
// 创建TCP连接
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {log.Printf("Failed to dial: %v", err)
}
defer conn.Close()// 配置KeepAlive
conn.SetKeepAlive(true)
3.3 获取连接信息
net
包还提供了一些方法来获取连接的详细信息。例如,可以通过conn.LocalAddr()
和conn.RemoteAddr()
方法获取本地和远程的地址信息。
示例代码:
localAddr := conn.LocalAddr()
remoteAddr := conn.RemoteAddr()
fmt.Printf("Local address: %v\n", localAddr)
fmt.Printf("Remote address: %v\n", remoteAddr)
四、实际应用场景
4.1 Web服务器
net
包是构建Web服务器的基础。在使用net/http
包之前,net
包已经提供了底层的网络通信功能。
示例代码:
package mainimport ("fmt""net/http"
)func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "Hello, World!")
}func main() {http.HandleFunc("/", helloHandler)fmt.Println("Starting server on :8080")http.ListenAndServe(":8080", nil)
}
4.2 实时通信
在需要实时通信的场景中,可以使用net
包搭配WebSocket协议来实现客户端和服务器之间的双向实时通信。
这里举例一个单向的:
服务端:接收客户端传来的消息
package mainimport ("fmt""net"
)func process(conn net.Conn) {defer conn.Close()for {buf := make([]byte, 1024)n, err := conn.Read(buf)if err != nil {return}fmt.Println(string(buf[:n]))}
}func main() {fmt.Println("服务端启动")listen, err := net.Listen("tcp", "127.0.0.1:8080")if err != nil {fmt.Println("监听失败")return}for {conn, err2 := listen.Accept()if err2 != nil {fmt.Println("客户端等待失败", err2)} else {fmt.Println("连接成功", conn, conn.RemoteAddr())}go process(conn)}}
客户端:向服务端发送消息
package mainimport ("bufio""fmt""net""os"
)func main() {fmt.Println("客户端启动")conn, err1 := net.Dial("tcp", "127.0.0.1:8080")if err1 != nil {fmt.Println("客户端连接失败:", err1)return}fmt.Println("连接成功.", conn)reader := bufio.NewReader(os.Stdin)for {str, err2 := reader.ReadString('\n')if err2 != nil {fmt.Println("终端输入失败", err2)}if str == "exit\n" {return}n, err3 := conn.Write([]byte(str))if err3 != nil {fmt.Println("连接失败", err3)}fmt.Printf("发送了%d个字节\n", n)}}
4.3 数据报送
对于需要快速传输数据且对可靠性要求不高的场景,可以使用UDP协议进行数据报送。
相关文章:
go 的 net 包
目录 一、net包的基本功能 1.1 IP地址处理 1.2 网络协议支持 1.3 连接管理 二、net包的主要功能模块 2.1 IP地址处理 2.2 TCP协议 2.3 UDP协议 2.4 Listener和Conn接口 三、高级功能 3.1 超时设置 3.2 KeepAlive控制 3.3 获取连接信息 四、实际应用场景 4.1 Web服…...

weibo_har鸿蒙微博分享,单例二次封装,鸿蒙微博,微博登录
weibo_har鸿蒙微博分享,单例二次封装,鸿蒙微博 HarmonyOS 5.0.3 Beta2 SDK,原样包含OpenHarmony SDK Ohos_sdk_public 5.0.3.131 (API Version 15 Beta2) 🏆简介 zyl/weibo_har是微博封装使用,支持原生core使用 &a…...

【MySQL数据库入门到精通-06 DCL操作】
一、DCL DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访 问权限。 二、管理用户 1.查询与创建用户 代码如下(示例): -- DCL 管理用户 -- 1.查询用户 use mysql; select *from user;-…...
第55讲:农业人工智能的跨学科融合与社会影响——构建更加可持续、包容的农业社会
目录 一、农业人工智能的多维融合:科技与社会的桥梁 1. 技术与社会:解决现代农业中的不平等 2. AI与伦理:塑造道德规范与社会责任 3. AI与政策:推动农业政策的科学决策与智能执行 二、AI与农业未来社会的构建:更绿色、更智能、更包容 1. 推动农业可持续发展:绿色农…...
nodejs之Express-介绍、路由
五、Express 1、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址: https://www.expressjs.com.cn/ 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务) (1)基本使用 第一步:初始化项目并…...

无感字符编码原址转换术——系统内存(Mermaid文本图表版/DeepSeek)
安全便捷无依赖,不学就会无感觉。 笔记模板由python脚本于2025-04-24 20:00:05创建,本篇笔记适合正在研究字符串编码制式的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 P…...
ecovadis认证需要提供哪些文件?ecovadis认证优势是什么?
EcoVadis认证详解:所需文件与核心优势 一、EcoVadis认证需要提供哪些文件? EcoVadis评估基于企业提交的ESG(环境、社会、治理)相关文档,具体包括以下四类核心主题的文件: 1. 环境(Environment…...

第七部分:向量数据库和索引策略
什么是矢量数据库? 简单来说,向量数据库是一种专门化的数据库,旨在优化存储和检索以高维向量形式表示的文本。 为什么这些数据库对RAG至关重要?因为向量表示能够在大规模文档库中进行高效的基于相似性的搜索,根据用户…...
Java 2025 技术全景与实战指南:从新特性到架构革新
作为一名Java开发者,2025年的技术浪潮将带给我们前所未有的机遇与挑战。本文将带你深入探索Java生态的最新发展,从语言特性到架构革新,助你在技术洪流中把握先机! 🌟 Java 2025 新特性全景 1. 模式匹配的全面进化 (J…...

查看MAC 地址以及简单了解
MAC地址 简介 MAC 地址(Media Access Control Address),直译为媒体访问控制地址,又称局域网地址(LAN Address)、MAC 地址、以太网地址(Ethernet Address)、硬件地址(Ha…...
c语言 write函数
write函数 #include <unistd.h>ssize_t write(int fd, const void *buf, size_t count); 参数说明 fd:这是文件描述符,用于指定要写入数据的目标对象。文件描述符是一个非负整数,它代表了一个打开的文件、设备、管道等。常见的文件描述符有: 0:标准输入(stdin)。…...
Halcon 的基础用法
基础语法 1. 下载链接2. 赋值3. 判断符4. 循环5. 加载图片6. 读取文件夹下所有图片 1. 下载链接 链接:https://pan.baidu.com/s/1ZhQ_tTcubUtUggbb-OxUGw?pwdw3rs 提取码:w3rs 2. 赋值 x : 1 s : hello list2 : [a, b, c]3. 判断符 * 等于比较符 if(x 1)h : 6 endif* 不等…...

《100天精通Python——基础篇 2025 第2天:Python解释器安装与基础语法入门》
目录 一、Windows安装Python1.1 下载并安装 Python1.2 测试安装是否成功 二、Linux系统安装Python(新手可以跳过)2.1 基于RockyLinux系统安装Python(编译安装)2.2 基于Ubuntu系统安装Python(编译安装)2.3 macOS 安装python解释器 三、如何运行Python程序?3.1 Python…...

MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异
以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异: 1. MyBatis 和 MyBatis-Plus 核心对比 特性MyBatisMyBatis-Plus定位基础持久层框架MyBatis 的增强版,提供代码生…...
【大模型有哪些训练阶段?】
大模型(如 GPT、BERT 等)训练一般可以分为以下 三个主要阶段,每个阶段都承担着不同的职责,共同推动模型从“语言新手”成长为“多任务专家”。 🧠 一、预训练阶段(Pre-training) 📌…...

动手试一试 Spring Boot默认缓存管理
1.准备数据 使用之前创建的springbootdata的数据库,该数据库有两个表t_article和t_comment,这两个表预先插入几条测试数据。 2.编写数据库表对应的实体类 Entity(name "t_comment") public class Comment {IdGeneratedValue(strategy Gener…...
A2A Agent 框架结构化分析报告
A2A Agent 框架结构化分析报告 第一章 绪论 1.1 引言 在全球数字化转型的浪潮中,人工智能(Artificial Intelligence, AI)技术正以前所未有的速度改变着我们的生活和工作方式。然而,随着AI系统的广泛应用,单一AI系统…...

Opencv图像处理:旋转、打包、多图像匹配
文章目录 一、图像的旋转1、使用numpy方法实现旋转1)顺时针旋转90度2)逆时针旋转90度 2、使用opencv的方法实现图像旋转1)顺时针旋转90度2)逆时针旋转90度3)旋转180度 3、效果 二、多图像匹配1、模板2、匹配对象3、代码…...

BOM与DOM(解疑document window关系)
BOM(浏览器对象模型) 定义与作用 BOM(Browser Object Model)提供与浏览器窗口交互的接口,用于控制导航、窗口尺寸、历史记录等浏览器行为 window:浏览器窗口的顶层对象,包含全局属性和方法&am…...

数据仓库建设全解析!
目录 一、数据仓库建设的重要性 1. 整合企业数据资源 2. 支持企业决策制定 3. 提升企业竞争力 二、数据仓库建设的前期准备 1. 明确业务需求 2. 评估数据源 3. 制定项目计划 三、数据仓库建设的具体流程 1.需求分析 2.架构设计 3.数据建模 4.ETL 开发 5.…...

时序约束 记录
一、基础知识 1、fpga的约束文件为.fdc,synopsys的约束文件为.sdc。想通过fpga验证soc设计是否正确,可以通过syn工具(synplify)吃.fdc把soc code 转换成netlist。然后vivado P&R工具通过吃上述netlist、XDC 出pin脚约束、fdc时序约束三个约束来完成…...
Redis-cli常用参数及功能的详细说明
Redis-cli常用参数及功能的详细说明 相关参考知识书籍 <<Redis运维与开发>> 以下是Redis-cli常用参数及功能的详细说明 1. **-r(重复执行命令)** 作用:重复执行指定命令多次。 示例:执行3次PING命令࿱…...
第十七届山东省职业院校技能大赛 中职组网络建设与运维赛项
第十七届山东省职业院校技能大赛 中职组网络建设与运维赛项 赛题 B 卷 第十七届山东省职业院校技能大赛中职组网络建设与运维赛项 1 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为以下三个模块: 网络理论测试; 网络建设与调试…...

基于SpringBoot的在线抽奖系统测试用例报告
一、项目背景 在线抽奖系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,redis来缓存验证码,RabbitMQ来缓存信息队列,同时将其部署到云服务器上。前端主要有登录页、后台管理页、活动列表页,抽奖页等…...
DeepSeek 部署中的常见问题及解决方案全解析
一、环境配置与依赖安装问题 1. 权限不足导致部署失败 问题现象:启动服务时提示权限错误,或无法访问文件系统。 解决方案: 账号权限:以管理员身份运行命令(Linux/macOS 使用 sudo,Windows 使用 PowerShe…...

26考研|数学分析:数项级数
数项级数这一章的开始,开启了新的关于“级数”这一新的概念体系的学习进程,此部分共包含四章的内容,分别为数项级数、函数项级数、幂级数以及傅里叶级数。这一章中,首先要掌握级数的相关概念与定义,重难点在于掌握判断…...

likeadmin前端请求地址配置踩坑
likeadmin前端本地调试执行步骤 第一步:npm i 安装项目所有依赖 第二步:npm run dev 启动 报错,发送的请求没通,很显然请求的地址不存在 第三步:查找接口请求地址 配置 根目录下有个.env.production.example 文件…...
Linux平台实现低延迟的RTSP、RTMP播放
在流媒体播放器的开发过程中,RTSP(实时流协议)和RTMP(实时消息协议)是广泛应用的流媒体协议。本博客将介绍如何使用大牛直播SDK实现一个Linux平台下的RTSP/RTMP播放器。大牛直播SDK的Linux平台播放SDK,支持…...

计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
概述 目标检测已经取得了长足的发展,尤其是随着基于 Transformer 的模型的兴起。RF-DETR,由 Roboflow 开发,就是这样一种模型,它兼顾了速度和精度。使用 Roboflow 的工具可以让整个过程变得更加轻松。他们的平台涵盖了从上传和标…...

系统思考:技术与产品协同
在《第五项修炼》中,彼得圣吉指出:组织中最根本的问题,往往不是个别人的能力,而是思维的局限和系统之间的断裂。我最近要给一家互联网公司交付系统思考的项目,客户希望技术和产品的管理者一起参加,也问我&a…...