Socket编程(go语言)
发布人:shili8
发布时间:2024-11-08 15:55
阅读次数:0
**Socket 编程 (Go语言)**Socket 是一种用于进程间通信的 API,允许不同进程之间传递数据。Go语言提供了一个强大的 Socket 库,使得开发者可以轻松地创建网络应用。
### 一、Socket 基础####1. socket 类型Go语言中有四种基本的 Socket 类型:
* `TCP`(面向连接):保证数据传输的顺序和准确性。
* `UDP`(无连接):不保证数据传输的顺序和准确性,速度较快,但可能丢失数据。
* `Unix Domain Socket`:用于进程间通信,速度最快。
####2. socket 创建创建一个 Socket 的步骤如下:
go// TCP socketconn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer conn.Close() // UDP socketconn, err = net.DialIP("udp4://127.0.0.1:8080", nil) if err != nil { log.Fatal(err) } defer conn.Close() // Unix Domain Socketl, err := net.Listen("unixgram", "/tmp/sock") if err != nil { log.Fatal(err) }
### 二、Socket 通信####1. TCP socket 通信TCP socket 通信涉及到连接建立、数据传输和连接关闭。
go// serverfunc main() { l, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer l.Close() for { conn, err := l.Accept() if err != nil { log.Fatal(err) } go handleConn(conn) // 处理连接 } } func handleConn(conn net.Conn) { buf := make([]byte,1024) for { n, err := conn.Read(buf) if err != nil { return } log.Println(string(buf[:n])) } }
go// clientfunc main() { conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer conn.Close() buf := []byte("Hello, server!") _, err = conn.Write(buf) if err != nil { log.Fatal(err) } }
####2. UDP socket 通信UDP socket 通信涉及到数据传输。
go// serverfunc main() { l, err := net.Listen("udp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer l.Close() for { buf := make([]byte,1024) n, _, err := l.ReadFrom(buf) if err != nil { return } log.Println(string(buf[:n])) } }
go// clientfunc main() { conn, err := net.Dial("udp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer conn.Close() buf := []byte("Hello, server!") _, err = conn.WriteTo(buf, nil) if err != nil { log.Fatal(err) } }
####3. Unix Domain Socket 通信Unix Domain Socket 通信涉及到数据传输。
go// serverfunc main() { l, err := net.Listen("unixgram", "/tmp/sock") if err != nil { log.Fatal(err) } defer l.Close() for { buf := make([]byte,1024) n, _, err := l.ReadFrom(buf) if err != nil { return } log.Println(string(buf[:n])) } }
go// clientfunc main() { conn, err := net.Dial("unixgram", "/tmp/sock") if err != nil { log.Fatal(err) } defer conn.Close() buf := []byte("Hello, server!") _, err = conn.WriteTo(buf, nil) if err != nil { log.Fatal(err) } }
### 三、Socket 错误处理Socket 错误处理涉及到错误类型和错误处理。
go// TCP socket 错误处理func main() { l, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer l.Close() for { conn, err := l.Accept() if err != nil { // 错误类型 switch err.(type) { case *net.OpError: log.Println("连接错误:", err) default: log.Println("其他错误:", err) } return } go handleConn(conn) // 处理连接 } }
### 四、Socket 性能优化Socket 性能优化涉及到缓冲区大小和并发连接数。
go// TCP socket 性能优化func main() { l, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer l.Close() // 缓冲区大小 bufSize :=1024 *1024 for { conn, err := l.Accept() if err != nil { return } go handleConn(conn, bufSize) // 处理连接 } } func handleConn(conn net.Conn, bufSize int) { buf := make([]byte, bufSize) for { n, err := conn.Read(buf) if err != nil { return } log.Println(string(buf[:n])) } }
### 五、Socket 安全性Socket 安全性涉及到连接验证和数据加密。
go// TCP socket 安全性func main() { l, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } defer l.Close() for { conn, err := l.Accept() if err != nil { return } go handleConn(conn) // 处理连接 // 连接验证 if !conn.SetDeadline(time.Now().Add(10 * time.Second)) { log.Println("连接超时") return } // 数据加密 cipher := &cipher.Stream{Stream: conn} go handleConn(cipher) // 处理加密数据 } } func handleConn(conn net.Conn) { buf := make([]byte,1024) for { n, err := conn.Read(buf) if err != nil { return } log.Println(string(buf[:n])) } }
### 六、Socket 总结Socket 是一种用于进程间通信的 API,允许不同进程之间传递数据。Go语言提供了一个强大的 Socket 库,使得开发者可以轻松地创建网络应用。Socket 编程涉及到连接建立、数据传输和连接关闭,以及错误处理、性能优化和安全性等方面。通过掌握这些知识,开发者可以创建高效、安全的网络应用。