golang 监听多个端口

发布时间:2024-07-07 17:56:29

Golang是一门开发高效、可靠且易于维护的编程语言,广泛应用于网络编程和服务器开发领域。在实际应用中,我们经常需要监听多个端口来处理不同类型的请求。本文将介绍如何使用Golang来同时监听多个端口。

使用net包监听多个端口

在Golang中,可以使用net包提供的功能来监听一个指定网络地址的端口。要同时监听多个端口,可以使用多个goroutine来执行并发的监听操作。下面是一个示例代码:

package main

import (
	"log"
	"net"
)

func listen(port string) {
	listener, err := net.Listen("tcp", ":"+port)
	if err != nil {
		log.Fatal(err)
	}
	defer listener.Close()

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Println(err)
			continue
		}
		go handleConnection(conn)
	}
}

func handleConnection(conn net.Conn) {
	// 处理连接逻辑
}

func main() {
	ports := []string{"8080", "9000", "9999"}

	for _, port := range ports {
		go listen(port)
	}

	select {}
}

上面的代码中,我们首先定义了一个listen函数,用于启动并监听一个指定端口的连接。然后,在main函数中,我们定义了一个端口列表,通过迭代列表,为每个端口启动一个goroutine来并发地监听这些端口。最后,使用select{}语句来阻塞主goroutine,保持程序的运行状态。

使用TCPListener接口监听多个端口

除了使用net包提供的接口外,我们还可以使用TCPListener接口进行多个端口的监听操作。这个接口在net包中定义如下:

type TCPListener struct {
    // 包含隐藏或非导出字段
}

func (l *TCPListener) Accept() (Conn, error)
func (l *TCPListener) Close() error
func (l *TCPListener) Addr() Addr

下面是一个使用TCPListener接口的示例代码:

package main

import (
	"log"
	"net"
)

func listen(port string) {
	listener, err := net.Listen("tcp", ":"+port)
	if err != nil {
		log.Fatal(err)
	}
	defer listener.Close()

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Println(err)
			continue
		}
		go handleConnection(conn)
	}
}

func handleConnection(conn net.Conn) {
	// 处理连接逻辑
}

func main() {
	ports := []string{"8080", "9000", "9999"}

	for _, port := range ports {
		laddr, err := net.ResolveTCPAddr("tcp", ":"+port)
		if err != nil {
			log.Fatal(err)
		}

		listener, err := net.ListenTCP("tcp", laddr)
		if err != nil {
			log.Fatal(err)
		}

		go func() {
			for {
				conn, err := listener.Accept()
				if err != nil {
					log.Println(err)
					continue
				}
				go handleConnection(conn)
			}
		}()
	}

	select {}
}

上面的代码中,我们使用net包提供的ResolveTCPAddr函数来解析TCP地址,并通过ListenTCP函数创建一个TCPListener实例。然后,在每个端口的goroutine中,使用Accept方法监听连接,并使用handleConnection函数来处理连接逻辑。

总结

本文介绍了如何使用Golang来监听多个端口。通过使用net包提供的功能和TCPListener接口,我们可以并发地监听多个端口并处理不同类型的请求。这种方式可以提高网络编程的效率和性能,适用于各种服务器开发场景。

相关推荐