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 套接字,你可以轻松实现网络通信。若有其他问题或需要更深入的内容,请随时问我!

相关推荐
weixin_472339461 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击1 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue3 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
tan180°3 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
m0_555762903 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊4 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
优创学社24 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术4 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理4 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
lzb_kkk5 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节