Go 语言实现非阻塞套接字示例
在 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' 将返回一个超时错误,并退出循环。
希望这个示例对你有帮助!
原文地址: https://www.cveoy.top/t/topic/qEVU 著作权归作者所有。请勿转载和采集!