Golang 中的 socket 编程:一步步带你入门 在计算机网络领域,Socket 是指一个抽象层,实现了网络应用程序与网络之间的数据传输。Socket 编程即为通过 Socket 接口实现网络程序的编程。 Golang 中也自带了 Socket 编程接口,可以很方便的实现网络编程。在本文中,我们将从基础开始一步步带你入门 Golang 中的 Socket 编程。 首先,我们需要引入 net 包,这个包包含了我们需要的一些函数和接口,比如 TCP、UDP 等。 ```go import ( "net" "fmt" ) ``` TCP 编程 TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 Golang 中,我们可以使用 net 包中的 Listen 函数来创建一个 TCP 服务端。 ```go func main() { listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("listen error:", err) return } for { conn, err := listener.Accept() if err != nil { fmt.Println("accept error:", err) return } go handleConnection(conn) } } ``` 在上面的例子中,我们创建了一个 TCP 服务器,监听本地的 8080 端口。每当有客户端连接进来时,都会创建一个新的 goroutine 来处理这个连接。 下面看一下如何实现我们的 handleConnection 函数: ```go func handleConnection(conn net.Conn) { defer conn.Close() buf := make([]byte, 1024) for { n, err := conn.Read(buf) if err != nil { fmt.Println("read error:", err) return } fmt.Println("Received:", string(buf[:n])) _, err = conn.Write([]byte("Hello from server!")) if err != nil { fmt.Println("write error:", err) return } } } ``` 在 handleConnection 函数中,我们首先使用 defer 关键字来延迟关闭连接。接着,我们定义了一个缓冲区,每当有数据传输进来时,就读取这个缓冲区并打印出接收到的文本,然后向客户端发送一个消息。 UDP 编程 与 TCP 不同,UDP 是一种无连接的传输层协议。UDP 速度快,但是不保证数据传输的可靠性。在 Golang 中,我们同样可以用 net 包中的 ListenPacket 函数来创建一个 UDP 服务器。 ```go func main() { addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8888") if err != nil { fmt.Println("resolve error:", err) return } conn, err := net.ListenUDP("udp", addr) if err != nil { fmt.Println("listen error:", err) return } for { buf := make([]byte, 1024) n, rAddr, err := conn.ReadFromUDP(buf) if err != nil { fmt.Println("read error:", err) continue } fmt.Println("Received:", string(buf[:n]), " from:", rAddr) _, err = conn.WriteToUDP([]byte("Hello from server!"), rAddr) if err != nil { fmt.Println("write error:", err) continue } } } ``` 在上面的例子中,我们创建了一个 UDP 服务器,监听本地的 8888 端口。每当有客户端发送 UDP 数据包时,都会打印出接收到的文本和发送者的地址,并向发送者发送一个消息。 结语 通过本文的学习,我们不仅了解了 Golang 中 Socket 编程的基础知识,还掌握了如何使用 Golang 的 net 包来实现 TCP 和 UDP 服务器。希望本文对读者的学习有所帮助,也欢迎大家在评论区分享自己的学习心得和问题。