golang套接字的实现
更新时间:2024年10月30日 09:41:17 作者:get200
Go语言中通过标准库net实现套接字编程,涵盖了TCP和UDP两种网络类型,通过这些基本概念和实际代码示例,可以帮助理解和掌握Go语言中的套接字编程
在 Go 语言中,使用标准库 net
来实现套接字编程。以下是有关 Go 套接字的基本概念和示例。
1. 基本概念
- 网络类型:
- TCP:流套接字,提供可靠的、面向连接的通信。
- UDP:数据报套接字,无连接,适用于快速传输。
2. TCP 套接字示例
服务器端代码
package main import ( "fmt" "net" ) func main() { // 创建 TCP 套接字 listener, err := net.Listen("tcp", ":12345") if err != nil { fmt.Println("Error starting server:", err) return } defer listener.Close() fmt.Println("Waiting for a connection...") for { // 接受连接 conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } fmt.Println("Connection established from", conn.RemoteAddr()) // 处理连接 go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() message := "Hello, Client!" conn.Write([]byte(message)) fmt.Println("Message sent to client:", message) }
客户端代码
package main import ( "fmt" "net" ) func main() { // 连接到服务器 conn, err := net.Dial("tcp", "localhost:12345") if err != nil { fmt.Println("Error connecting to server:", err) return } defer conn.Close() // 接收数据 buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading from server:", err) return } fmt.Println("Received message from server:", string(buffer[:n])) }
3. UDP 套接字示例
服务器端代码
package main import ( "fmt" "net" ) func main() { // 创建 UDP 套接字 address, err := net.ResolveUDPAddr("udp", ":12345") if err != nil { fmt.Println("Error resolving address:", err) return } conn, err := net.ListenUDP("udp", address) if err != nil { fmt.Println("Error listening:", err) return } defer conn.Close() fmt.Println("Waiting for a connection...") for { buffer := make([]byte, 1024) n, addr, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("Error reading from UDP:", err) continue } fmt.Println("Received message from", addr, ":", string(buffer[:n])) // 发送响应 response := []byte("Hello, UDP Client!") conn.WriteToUDP(response, addr) } }
客户端代码
package main import ( "fmt" "net" ) func main() { // 发送 UDP 数据包 address, err := net.ResolveUDPAddr("udp", "localhost:12345") if err != nil { fmt.Println("Error resolving address:", err) return } conn, err := net.DialUDP("udp", nil, address) if err != nil { fmt.Println("Error connecting:", err) return } defer conn.Close() message := []byte("Hello, Server!") conn.Write(message) // 接收响应 buffer := make([]byte, 1024) n, _, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Println("Error reading from server:", err) return } fmt.Println("Received message from server:", string(buffer[:n])) }
4. 运行示例
- 首先在一个终端中运行服务器代码。
- 然后在另一个终端中运行客户端代码。
总结
Go 语言的 net
包使得套接字编程变得简单而高效。通过使用 TCP 或 UDP 套接字,你可以轻松实现网络通信。
到此这篇关于golang套接字的实现的文章就介绍到这了,更多相关golang套接字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
相关文章
golang如何通过viper读取config.yaml文件
这篇文章主要介绍了golang通过viper读取config.yaml文件,围绕golang读取config.yaml文件的相关资料展开详细内容,需要的小伙伴可以参考一下2022-03-03golang中http请求的context传递到异步任务的坑及解决
这篇文章主要介绍了golang中http请求的context传递到异步任务的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-03-03
最新评论