golang套接字

在 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. 运行示例

  1. 首先在一个终端中运行服务器代码。
  2. 然后在另一个终端中运行客户端代码。

总结

Go 语言的 net 包使得套接字编程变得简单而高效。通过使用 TCP 或 UDP 套接字,你可以轻松实现网络通信。若有其他问题或需要更深入的内容,请随时问我!

相关推荐
知识分享小能手9 分钟前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(22)
开发语言·学习·r语言
IT爱学堂11 分钟前
Go开发疑难杂症终结者通关指南
后端
乐观勇敢坚强的老彭13 分钟前
C++信奥GESP四级的常见题型和解题模板速查表
开发语言·c++
denggun1234519 分钟前
信号量(DispatchSemaphore vs AsyncSemaphore)、swift协作式线程池 and python信号量
开发语言·python·swift
大勇前进22 分钟前
从10分钟到10秒:一个真实慢查询的SQL Server优化全记录
后端
lisw0522 分钟前
计算与科学哲学(Philosophy of Computing and Science)
java·开发语言·人工智能
站大爷IP23 分钟前
被Python异步坑了三年,才搞懂await和create_task的区别
后端
大白8023 分钟前
你的数据库密码还在用明文?SQL Server 凭据管理的 3 种现代方案
后端
凤山老林23 分钟前
Spring Boot 集成 ShardingSphere-Encrypt 实现字段级实时脱敏
java·spring boot·后端·数据脱敏
vipxieliang23 分钟前
ValidX v1.2.0 更新日志
java·后端