面试题答案
一键面试利用 net/http
包多路复用机制
net/http
包内部实现了多路复用,通过 http.Server
来处理多个客户端连接。它基于 net.Listener
监听端口,并使用 Serve
方法来处理接收到的连接。http.Server
内部有一个协程池来并发处理请求,从而实现多路复用。
利用 select
语句实现多路复用
select
语句用于在多个通信操作(如 channel
的读写)之间进行选择。在处理 TCP 连接时,可以利用 select
语句监听多个连接的读写操作,当某个连接有数据可读或可写时,select
语句会触发相应的分支,从而实现对多个连接的并发处理。
示例代码(使用 select
语句)
package main
import (
"fmt"
"net"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Read error:", err)
return
}
message := string(buffer[:n])
fmt.Println("Received:", message)
_, err = conn.Write([]byte("Message received: " + message))
if err != nil {
fmt.Println("Write error:", err)
return
}
}
}
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Listen error:", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Accept error:", err)
continue
}
go handleConnection(conn)
}
}
在上述代码中:
net.Listen
监听本地的8080
端口。- 在
for
循环中,listener.Accept
接受新的客户端连接。 - 每当有新连接时,启动一个新的协程
handleConnection
来处理该连接,从而实现多路复用,即可以同时处理多个客户端连接。 handleConnection
函数从连接中读取数据,打印接收到的消息,并回显一条确认消息给客户端。如果在读写过程中出现错误,则关闭连接。