在 Go 语言中,可以使用 'net' 包来实现非阻塞套接字。下面是一个简单的示例代码:

package main

import (
    "fmt"
    "net"
    "os"
    "time"
)

func main() {
    // 创建 TCP 服务器
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error listening:", err)
        os.Exit(1)
    }
    defer ln.Close()

    // 设置非阻塞模式
    if tcpListener, ok := ln.(*net.TCPListener); ok {
        tcpListener.SetDeadline(time.Now().Add(2 * time.Second))
    }

    fmt.Println("Listening on :8080")

    // 接受连接
    for {
        conn, err := ln.Accept()
        if err != nil {
            if opErr, ok := err.(*net.OpError); ok && opErr.Timeout() {
                fmt.Println("Timeout")
                break
            }
            fmt.Println("Error accepting connection:", err)
            continue
        }

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

func handleConnection(conn net.Conn) {
    defer conn.Close()

    // 读取请求
    buffer := make([]byte, 1024)
    _, err := conn.Read(buffer)
    if err != nil {
        fmt.Println("Error reading request:", err)
        return
    }

    // 响应请求
    response := 'Hello, World!'
    _, err = conn.Write([]byte(response))
    if err != nil {
        fmt.Println("Error writing response:", err)
        return
    }
}

在上面的代码中,我们使用 'net.Listen' 函数创建了一个 TCP 服务器,并设置了非阻塞模式。然后通过 'ln.Accept' 接受连接,并使用 'go' 关键字在新的 goroutine 中处理连接。在 'handleConnection' 函数中,我们读取请求并发送响应。

注意,为了模拟非阻塞套接字的超时,我们在 'ln.Accept' 之前设置了一个 2 秒的截止时间。当超过这个时间时,'ln.Accept' 将返回一个超时错误,并退出循环。

希望这个示例对你有帮助!

Go 语言实现非阻塞套接字示例

原文地址: https://www.cveoy.top/t/topic/qEVU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录