首页 > 后端开发 > Golang > 正文

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

霞舞
发布: 2025-11-15 20:04:22
原创
238人浏览过

 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允许你指定监听的本地地址:

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483
查看详情 豆包AI编程
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语言免费学习笔记(深入)”;

登录后复制

以上就是Go语言网络编程:连接、监听与TCP控制的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号