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

package main

import (
	"fmt"
	"net"
)

func main() {
	// 创建一个TCP监听器
	listener, err := net.Listen("tcp", "localhost:8888")
	if err != nil {
		fmt.Println("Error listening:", err)
		return
	}
	defer listener.Close()

	// 设置监听器为非阻塞模式
	listener.(*net.TCPListener).SetDeadline(0)

	// 接受连接并处理
	for {
		conn, err := listener.Accept()
		if err != nil {
			// 如果没有新的连接,会返回一个错误,这时可以继续处理其他任务
			if e, ok := err.(net.Error); ok && e.Temporary() {
				continue
			}
			fmt.Println("Error accepting connection:", err)
			break
		}

		// 在新的goroutine中处理连接
		go handleConnection(conn)
	}
}

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

	// 处理具体的连接逻辑,这里只是简单地回显接收到的数据
	buf := make([]byte, 1024)
	for {
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("Error reading:", err)
			break
		}

		_, err = conn.Write(buf[:n])
		if err != nil {
			fmt.Println("Error writing:", err)
			break
		}
	}
}

在这个示例中,我们创建了一个TCP监听器,并将其设置为非阻塞模式。然后,我们循环接受连接,并在新的goroutine中处理每个连接。在连接处理函数中,我们简单地实现了一个回显服务器,将接收到的数据原样返回给客户端。

Go语言非阻塞套接字实现:示例代码与解析

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

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