MST

星途 面试题库

面试题:Go网络编程中如何使用多路复用实现并发处理连接

在Go网络编程场景下,假设要处理多个客户端的TCP连接,简述如何利用多路复用技术(如使用 `net/http` 包相关多路复用机制或 `select` 语句实现多路复用)来实现高效的并发处理,并且写出一个简单示例代码片段,展示最基本的多路复用处理连接逻辑。
32.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

利用 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)
    }
}

在上述代码中:

  1. net.Listen 监听本地的 8080 端口。
  2. for 循环中,listener.Accept 接受新的客户端连接。
  3. 每当有新连接时,启动一个新的协程 handleConnection 来处理该连接,从而实现多路复用,即可以同时处理多个客户端连接。
  4. handleConnection 函数从连接中读取数据,打印接收到的消息,并回显一条确认消息给客户端。如果在读写过程中出现错误,则关闭连接。