Go语言非阻塞套接字实现:示例代码与解析
在 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中处理每个连接。在连接处理函数中,我们简单地实现了一个回显服务器,将接收到的数据原样返回给客户端。
原文地址: https://www.cveoy.top/t/topic/qEV4 著作权归作者所有。请勿转载和采集!