golang套接字的实现

 更新时间:2024年10月30日 09:41:17   作者:get200  
Go语言中通过标准库net实现套接字编程,涵盖了TCP和UDP两种网络类型,通过这些基本概念和实际代码示例,可以帮助理解和掌握Go语言中的套接字编程

在 Go 语言中,使用标准库 net 来实现套接字编程。以下是有关 Go 套接字的基本概念和示例。

1. 基本概念

  • 网络类型
    • TCP:流套接字,提供可靠的、面向连接的通信。
    • UDP:数据报套接字,无连接,适用于快速传输。

2. TCP 套接字示例

服务器端代码

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)
}

客户端代码

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 套接字示例

服务器端代码

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)
    }
}

客户端代码

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

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

总结

Go 语言的 net 包使得套接字编程变得简单而高效。通过使用 TCP 或 UDP 套接字,你可以轻松实现网络通信。

到此这篇关于golang套接字的实现的文章就介绍到这了,更多相关golang套接字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go函数使用(函数定义、函数声明、函数调用等)

    Go函数使用(函数定义、函数声明、函数调用等)

    本文主要介绍了Go函数使用,包括函数定义、函数声明、函数调用、可变参数函数、匿名函数、递归函数、高阶函数等,感兴趣的可以了解一下
    2023-11-11
  • 深入探讨Go语言中的预防性接口为什么是不必要的

    深入探讨Go语言中的预防性接口为什么是不必要的

    在Go语言中,有一种从其他语言带来的常见模式:预防性接口,虽然这种模式在 Java 等语言中很有价值,但在Go中往往会成为反模式,本文我们就来深入探讨一下原因
    2025-01-01
  • Golang利用channel协调协程的方法详解

    Golang利用channel协调协程的方法详解

    go 当中的并发编程是通过goroutine来实现的,利用channel(管道)可以在协程之间传递数据,所以本文就来讲讲Golang如何利用channel协调协程吧
    2023-05-05
  • Kubernetes上使用Jaeger分布式追踪基础设施详解

    Kubernetes上使用Jaeger分布式追踪基础设施详解

    这篇文章主要为大家介绍了Kubernetes上使用Jaeger分布式追踪基础设施详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 详解Go语言中ErrGroup的使用

    详解Go语言中ErrGroup的使用

    本文主要为大家详细介绍了Go语言中errGroup的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-07-07
  • Golang操作excel的技巧与方法

    Golang操作excel的技巧与方法

    在Golang中操作Excel可以包括读取、写入和编辑Excel文件,你可以定义函数或方法来执行这些操作,本文给大家介绍了Golang操作excel的技巧与方法,文中有详细的代码讲解,需要的朋友可以参考下
    2024-05-05
  • Linux环境下编译并运行go项目的全过程

    Linux环境下编译并运行go项目的全过程

    Go语言是Google的开源编程语言,广泛应用于云计算、分布式系统开发等领域,在Linux上也有大量的应用场景,这篇文章主要给大家介绍了关于Linux环境下编译并运行go项目的相关资料,需要的朋友可以参考下
    2023-11-11
  • Go语言到底有没有引用传参(对比 C++ )

    Go语言到底有没有引用传参(对比 C++ )

    这篇文章主要介绍了Go 到底有没有引用传参(对比 C++ ),需要的朋友可以参考下
    2017-09-09
  • Go语言的互斥锁的详细使用

    Go语言的互斥锁的详细使用

    本文主要介绍了Go语言的互斥锁的详细使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Golang的引用类型和指针的使用与区别

    Golang的引用类型和指针的使用与区别

    本文详细介绍了Golang中的引用类型和指针的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02

最新评论