当前位置: 代码网 > it编程>前端脚本>Golang > golang套接字的实现

golang套接字的实现

2024年11月26日 Golang 我要评论
在 go 语言中,使用标准库net来实现套接字编程。以下是有关 go 套接字的基本概念和示例。1. 基本概念网络类型:tcp:流套接字,提供可靠的、面向连接的通信。udp:数据报套接字,无连接,适用于

在 go 语言中,使用标准库 net 来实现套接字编程。以下是有关 go 套接字的基本概念和示例。

1. 基本概念

  • 网络类型
    • tcp:流套接字,提供可靠的、面向连接的通信。
    • udp:数据报套接字,无连接,适用于快速传输。

2. tcp 套接字示例

服务器端代码

package main

import (
    "fmt"
    "net"
)

func main() {
    // 创建 tcp 套接字
    listener, err := net.listen("tcp", ":12345")
    if err != nil {
        fmt.println("error starting server:", err)
        return
    }
    defer listener.close()

    fmt.println("waiting for a connection...")
    for {
        // 接受连接
        conn, err := listener.accept()
        if err != nil {
            fmt.println("error accepting connection:", err)
            continue
        }
        fmt.println("connection established from", conn.remoteaddr())

        // 处理连接
        go handleconnection(conn)
    }
}

func handleconnection(conn net.conn) {
    defer conn.close()
    message := "hello, client!"
    conn.write([]byte(message))
    fmt.println("message sent to client:", message)
}

客户端代码

package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接到服务器
    conn, err := net.dial("tcp", "localhost:12345")
    if err != nil {
        fmt.println("error connecting to server:", err)
        return
    }
    defer conn.close()

    // 接收数据
    buffer := make([]byte, 1024)
    n, err := conn.read(buffer)
    if err != nil {
        fmt.println("error reading from server:", err)
        return
    }

    fmt.println("received message from server:", string(buffer[:n]))
}

3. udp 套接字示例

服务器端代码

package main

import (
    "fmt"
    "net"
)

func main() {
    // 创建 udp 套接字
    address, err := net.resolveudpaddr("udp", ":12345")
    if err != nil {
        fmt.println("error resolving address:", err)
        return
    }

    conn, err := net.listenudp("udp", address)
    if err != nil {
        fmt.println("error listening:", err)
        return
    }
    defer conn.close()

    fmt.println("waiting for a connection...")
    for {
        buffer := make([]byte, 1024)
        n, addr, err := conn.readfromudp(buffer)
        if err != nil {
            fmt.println("error reading from udp:", err)
            continue
        }
        fmt.println("received message from", addr, ":", string(buffer[:n]))

        // 发送响应
        response := []byte("hello, udp client!")
        conn.writetoudp(response, addr)
    }
}

客户端代码

package main

import (
    "fmt"
    "net"
)

func main() {
    // 发送 udp 数据包
    address, err := net.resolveudpaddr("udp", "localhost:12345")
    if err != nil {
        fmt.println("error resolving address:", err)
        return
    }

    conn, err := net.dialudp("udp", nil, address)
    if err != nil {
        fmt.println("error connecting:", err)
        return
    }
    defer conn.close()

    message := []byte("hello, server!")
    conn.write(message)

    // 接收响应
    buffer := make([]byte, 1024)
    n, _, err := conn.readfromudp(buffer)
    if err != nil {
        fmt.println("error reading from server:", err)
        return
    }

    fmt.println("received message from server:", string(buffer[:n]))
}

4. 运行示例

  • 首先在一个终端中运行服务器代码。
  • 然后在另一个终端中运行客户端代码。

总结

go 语言的 net 包使得套接字编程变得简单而高效。通过使用 tcp 或 udp 套接字,你可以轻松实现网络通信。

到此这篇关于golang套接字的实现的文章就介绍到这了,更多相关golang套接字内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com