go 的 net 包

news2025/4/25 16:09:02

目录

一、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 main

import (
    "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 main

import (
	"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 main

import (
	"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协议进行数据报送。

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

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

相关文章

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;-…

无感字符编码原址转换术——系统内存(Mermaid文本图表版/DeepSeek)

安全便捷无依赖,不学就会无感觉。 笔记模板由python脚本于2025-04-24 20:00:05创建,本篇笔记适合正在研究字符串编码制式的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 P…

第七部分:向量数据库和索引策略

什么是矢量数据库? 简单来说,向量数据库是一种专门化的数据库,旨在优化存储和检索以高维向量形式表示的文本。 为什么这些数据库对RAG至关重要?因为向量表示能够在大规模文档库中进行高效的基于相似性的搜索,根据用户…

查看MAC 地址以及简单了解

MAC地址 简介 MAC 地址(Media Access Control Address),直译为媒体访问控制地址,又称局域网地址(LAN Address)、MAC 地址、以太网地址(Ethernet Address)、硬件地址(Ha…

《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 的增强版,提供代码生…

动手试一试 Spring Boot默认缓存管理

1.准备数据 使用之前创建的springbootdata的数据库,该数据库有两个表t_article和t_comment,这两个表预先插入几条测试数据。 2.编写数据库表对应的实体类 Entity(name "t_comment") public class Comment {IdGeneratedValue(strategy Gener…

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时序约束三个约束来完成…

基于SpringBoot的在线抽奖系统测试用例报告

一、项目背景 在线抽奖系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,redis来缓存验证码,RabbitMQ来缓存信息队列,同时将其部署到云服务器上。前端主要有登录页、后台管理页、活动列表页,抽奖页等…

26考研|数学分析:数项级数

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

likeadmin前端请求地址配置踩坑

likeadmin前端本地调试执行步骤 第一步:npm i 安装项目所有依赖 第二步:npm run dev 启动 报错,发送的请求没通,很显然请求的地址不存在 第三步:查找接口请求地址 配置 根目录下有个.env.production.example 文件…

计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解

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

系统思考:技术与产品协同

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

面试之消息队列

消息队列场景 什么是消息队列? 消息队列是一个使用队列来通信的组件,它的本质就是个转发器,包含发消息、存消息、消费消息。 消息队列怎么选型? 特性ActiveMQRabbitMQRocketMQKafka单机吞吐量万级万级10万级10万级时效性毫秒级…

通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索

本文主要演示了如何使用阿里云向量检索服务Milvus版与通义千问VL大模型,提取图片特征,并使用多模态Embedding模型,快速实现多模态搜索。 基于灵积(Dashscope)模型服务上的通义千问 API以及Embedding API来接入图片、文…

使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置

以下是使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置: 1. 环境准备 Spring Boot 版本:2.7.x(兼容 Spring Boot Admin 2.x)Spring Boot…