在 Go 语言中,使用标准库 net
来实现套接字编程。以下是有关 Go 套接字的基本概念和示例。
1. 基本概念
- 网络类型 :
- TCP:流套接字,提供可靠的、面向连接的通信。
- UDP:数据报套接字,无连接,适用于快速传输。
2. TCP 套接字示例
服务器端代码
go
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)
}
客户端代码
go
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 套接字示例
服务器端代码
go
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)
}
}
客户端代码
go
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 套接字,你可以轻松实现网络通信。若有其他问题或需要更深入的内容,请随时问我!