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 编程涉及到连接建立、数据传输和连接关闭,以及错误处理、性能优化和安全性等方面。通过掌握这些知识,开发者可以创建高效、安全的网络应用。

