Golang中的Socket编程有以下几个特点:
- 简单明了:Golang通过net包提供简单易用的Socket API,可以轻松实现TCP/UDP客户端和服务器。
- 并发友好:Golang的goroutine和channel特性可以轻易地实现并发Socket编程。
- 零拷贝:Golang支持直接操作底层字节数组,可以实现高效的零拷贝发送和接收。
- 阻塞和非阻塞:Golang同时支持阻塞和非阻塞的Socket操作。
代码示例:
TCP 客户端:
go
conn, err := net.Dial("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("data"))
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 512)
n, err := conn.Read(buf)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", buf[:n])
TCP 服务器:
go
listener, err := net.Listen("tcp", ":8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal(err)
}
go handleConnection(conn)
}
func handleConnection(conn net.Conn) {
buf := make([]byte, 512)
for {
n, err := conn.Read(buf)
if err != nil {
log.Fatal(err)
}
if n == 0 {
return
}
_, err = conn.Write(buf[:n])
if err != nil {
log.Fatal(err)
}
}
}
UDP 客户端:
go
conn, err := net.Dial("udp", ":8000")
if err != nil {
log.Fatal(err)
}
_, err = conn.Write([]byte("data"))
if err != nil {
log.Fatal(err)
}
UDP 服务器:
go
conn, err := net.Listen("udp", ":8000")
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 512)
n, addr, err := conn.ReadFrom(buf)
if err != nil {
log.Fatal(err)
}
_, err = conn.WriteTo(buf[:n], addr)
if err != nil {
log.Fatal(err)
}