发布时间:2024-12-22 23:27:54
在Go语言开发中,网络编程是一个重要的部分。而在网络编程中,监听TCP连接是非常常见的场景。本文将介绍如何使用Golang监听TCP连接。
Golang的标准库中提供了一个强大的net包,用于处理底层网络通信。通过net包,我们可以很方便地实现TCP监听功能。下面是一个简单的示例:
``` package main import ( "fmt" "net" ) func main() { listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("Error listening:", err.Error()) return } defer listener.Close() fmt.Println("Listening on 127.0.0.1:8080") for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err.Error()) return } go handleRequest(conn) } } func handleRequest(conn net.Conn) { buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading:", err.Error()) return } request := string(buffer[:n]) fmt.Println("Received request:", request) conn.Close() } ```以上代码先使用net.Listen函数创建了一个TCP监听器,指定监听地址为127.0.0.1:8080。然后使用一个无限循环来接受客户端的连接,并开启一个goroutine来处理每个连接。在handleRequst函数中,我们简单地读取客户端发送的请求,并在控制台打印请求内容。
上面的示例只能处理一个连接,要处理更多的连接,我们可以使用并发编程的方式。可以通过创建goroutine来并行地处理多个连接。
``` package main import ( "fmt" "net" ) func main() { listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("Error listening:", err.Error()) return } defer listener.Close() fmt.Println("Listening on 127.0.0.1:8080") for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err.Error()) return } go handleRequest(conn) } } func handleRequest(conn net.Conn) { buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading:", err.Error()) return } request := string(buffer[:n]) fmt.Println("Received request:", request) conn.Close() } ```以上代码与之前的示例相似。主程序通过一个无限循环不断地接受客户端的连接,并为每个连接都创建一个goroutine。这样就可以同时处理多个连接了。
除了监听一个固定的端口外,有时候我们还需要监听多个端口。Golang提供了一个net.ListenTCP函数,可以方便地实现这个功能。
``` package main import ( "fmt" "net" ) func main() { addr := &net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 0, } listener1, err := net.ListenTCP("tcp", addr) if err != nil { fmt.Println("Error listening:", err.Error()) } addr2 := &net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 8088, } listener2, err := net.ListenTCP("tcp", addr2) if err != nil { fmt.Println("Error listening:", err.Error()) } defer listener1.Close() defer listener2.Close() fmt.Println("Listening on", listener1.Addr()) fmt.Println("Listening on", listener2.Addr()) select {} } ```以上代码中,我们创建了两个TCP监听器,一个监听的是随机端口,另一个监听的是8088端口。通过listener1.Addr()和listener2.Addr()可以获取监听器的地址信息。
通过以上三个例子,我们可以看到,在Golang中实现TCP监听非常简单。使用net包提供的函数,我们可以轻松地监听TCP连接,并对连接进行处理。