Go 语言非阻塞套接字实现:示例与最佳实践
在 Go 语言中,可以使用 `net` 包来实现非阻塞套接字。下面是一个简单的示例代码,演示如何使用非阻塞套接字进行读写操作:
package main
import (
"log"
"net"
)
func main() {
listen, err := net.Listen("tcp", "localhost:8080")
if err != nil {
log.Fatal(err)
}
defer listen.Close()
for {
conn, err := listen.Accept()
if err != nil {
log.Fatal(err)
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
// 设置套接字为非阻塞模式
if tcpConn, ok := conn.(*net.TCPConn); ok {
tcpConn.SetNonblock(true)
}
// 处理读写操作
buffer := make([]byte, 1024)
for {
// 非阻塞读取数据
n, err := conn.Read(buffer)
if err != nil {
if err == net.ErrClosed {
log.Println("Connection closed by remote")
break
}
// 非阻塞读取时可能返回一个临时错误
if opErr, ok := err.(*net.OpError); ok && opErr.Temporary() {
log.Println("Temporary error:", err)
continue
}
log.Println("Error reading:", err)
break
}
if n > 0 {
data := buffer[:n]
log.Println("Received:", string(data))
// 非阻塞写入数据
_, err := conn.Write(data)
if err != nil {
log.Println("Error writing:", err)
break
}
}
}
}
在上述代码中,使用 `net.Listen` 函数创建一个 TCP 监听器,并使用 `Accept` 方法接收新的连接。对于每个接收到的连接,我们使用 `go` 关键字创建一个新的 goroutine 来处理连接。在 `handleConnection` 函数中,我们首先将连接套接字设置为非阻塞模式,然后使用非阻塞的方式读取数据,并通过非阻塞方式写入数据。如果在读写过程中出现错误,我们相应地处理它们。
请注意,上述代码仅用于演示目的,实际应用中可能需要更多的错误处理和逻辑。
原文地址: https://www.cveoy.top/t/topic/qEVA 著作权归作者所有。请勿转载和采集!