讲师中心 微信公众号
AI工具推荐 视频效率加速

Go语言网络编程:连接、监听与TCP控制

冬敏小哥_5499

冬敏小哥_5499

发布时间:2025-11-15 20:04:22

|

328人浏览过

|

来源于php中文网

原创

 Go语言网络编程:连接、监听与TCP控制

<p>本文旨在帮助Go语言开发者理解网络编程中的关键概念,包括如何使用`net.Dial`进行连接,`net.Listen`进行监听,以及`DialTCP`和`ListenTCP`提供的更细粒度的TCP控制。通过示例代码和解释,本文将阐明这些函数的使用场景和区别,帮助开发者构建高效可靠的网络应用。</p> Go语言提供了强大的网络编程支持,其`net`包提供了丰富的API,可以方便地构建各种网络应用。理解`net`包中的关键函数,如`Dial`、`Listen`、`DialTCP`和`ListenTCP`,对于编写高效可靠的网络应用至关重要。 ### 连接到远程主机:`net.Dial` 在Go中,使用`net.Dial`函数可以连接到远程主机。该函数接受网络协议类型和地址作为参数,返回一个`Conn`对象,该对象代表已建立的连接。`Conn`接口实现了`io.ReadWriteCloser`接口,可以用于发送和接收数据。 `net.Dial`函数支持多种网络协议,例如TCP、UDP、IP和Unix域套接字。以下是一些示例: ```go package main import ( "fmt" "net" ) func main() { connTCP, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("Error dialing TCP:", err) return } defer connTCP.Close() fmt.Println("Connected to Google via TCP") connUDP, err := net.Dial("udp", "tracker.thepiratebay.org:6969") if err != nil { fmt.Println("Error dialing UDP:", err) return } defer connUDP.Close() fmt.Println("Connected to PirateBay Tracker via UDP") // 注意: 直接dial "ip" 需要root权限 //connIP, err := net.Dial("ip", "kremvax.su") //if err != nil { // fmt.Println("Error dialing IP:", err) // return //} //defer connIP.Close() //fmt.Println("Connected to kremvax.su via IP") connUnix, err := net.Dial("unix", "/dev/log") if err != nil { fmt.Println("Error dialing Unix:", err) return } defer connUnix.Close() fmt.Println("Connected to /dev/log via Unix socket") }

监听端口:net.Listen

要监听端口并接受传入连接,可以使用net.listen函数。该函数接受网络协议类型和地址作为参数,返回一个listener对象。调用listener对象的accept方法可以接受传入的连接,该方法返回一个conn对象,可以用于与客户端进行通信。

package main

import (
    "fmt"
    "net"
)

func main() {
    ls, err := net.Listen("tcp", ":1337")
    if err != nil {
        fmt.Println("Error listening:", err)
        return
    }
    defer ls.Close()

    fmt.Println("Listening on port 1337")

    for {
        conn, err := ls.Accept()
        if err != nil {
            fmt.Println("Error accepting:", err)
            continue
        }
        defer conn.Close()

        fmt.Println("Accepted connection from:", conn.RemoteAddr())

        _, err = conn.Write([]byte("Hello, world!\n"))
        if err != nil {
            fmt.Println("Error writing:", err)
            continue
        }
    }
}

更细粒度的TCP控制:DialTCP和ListenTCP

DialTCP和ListenTCP函数提供了对TCP连接更细粒度的控制。它们允许你指定本地地址、远程地址等参数。通常情况下,建议使用更简单的Dial和Listen函数,除非你的程序确实需要更精细的控制。

例如,你可以使用DialTCP来指定本地地址:

package main

import (
    "fmt"
    "net"
)

func main() {
    localAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0") // 0 表示随机端口
    if err != nil {
        fmt.Println("Error resolving local address:", err)
        return
    }

    remoteAddr, err := net.ResolveTCPAddr("tcp", "google.com:80")
    if err != nil {
        fmt.Println("Error resolving remote address:", err)
        return
    }

    conn, err := net.DialTCP("tcp", localAddr, remoteAddr)
    if err != nil {
        fmt.Println("Error dialing TCP:", err)
        return
    }
    defer conn.Close()

    fmt.Println("Connected to Google via TCP using local address:", conn.LocalAddr())
}

类似地,ListenTCP允许你指定监听的本地地址:

google-sheets-soha
google-sheets-soha

读取并分析Google表格数据。当用户提到“Google表格”、“电子表格”、“表格”,或发送 docs.google.com/spreadsheets 链接时触发。

下载
package main

import (
    "fmt"
    "net"
    "net/netip"
)

func main() {
    addr := netip.AddrPortFrom(netip.IPv4(127, 0, 0, 1), 1337)
    localAddr := net.TCPAddr{
        IP:   addr.Addr().AsSlice(),
        Port: int(addr.Port()),
        Zone: "",
    }
    ls, err := net.ListenTCP("tcp", &localAddr)
    if err != nil {
        fmt.Println("Error listening:", err)
        return
    }
    defer ls.Close()

    fmt.Println("Listening on 127.0.0.1:1337")
    // ... (accept connections as before)
}

总结

net.Dial和net.Listen是Go语言网络编程中最常用的函数,用于建立连接和监听端口。DialTCP和ListenTCP提供了更细粒度的控制,但在大多数情况下,使用Dial和Listen就足够了。理解这些函数的使用场景和区别,可以帮助你构建高效可靠的网络应用。在选择使用哪个函数时,请根据你的程序的需求进行权衡。如果只需要建立简单的连接或监听端口,那么Dial和Listen是更好的选择。如果需要更细粒度的控制,例如指定本地地址,那么可以使用DialTCP和ListenTCP。

立即学习“go语言免费学习笔记(深入)”;

					

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

969

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2900

2023.10.25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3148

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4849

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3789

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

446

2026.01.19

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

2829

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

5647

2023.09.25

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn