Golang中的Socket编程有什么特点?代码举例讲解

Golang中的Socket编程有以下几个特点:

  1. 简单明了:Golang通过net包提供简单易用的Socket API,可以轻松实现TCP/UDP客户端和服务器。
  2. 并发友好:Golang的goroutine和channel特性可以轻易地实现并发Socket编程。
  3. 零拷贝:Golang支持直接操作底层字节数组,可以实现高效的零拷贝发送和接收。
  4. 阻塞和非阻塞: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)
}