首页 > 其他分享 >【golang】Go语言实现数据转发功能

【golang】Go语言实现数据转发功能

时间:2023-12-28 15:27:04浏览次数:34  
标签:UDP err fmt 转发 golang Error Go net data

首先,我们需要考虑数据实体的格式。在许多情况下,使用JSON格式最为方便。Go语言中有一个标准库“encoding/json”可以提供JSON编解码功能。我们可以使用它来将我们的数据序列化为JSON格式,并将其发送到目标组件中。

接下来,我们需要选择一种合适的网络协议来实现数据传输。常用的协议有TCP、UDP和HTTP等。这里我们将使用UDP协议。UDP相对于TCP来说,具有更小的开销和更快的传输速度。但是,它不保证数据的可靠性,需要我们自己实现重传机制来保证数据的完整性。

在我们的代码中,我们需要实现两个组件:发送方和接收方。发送方负责将数据转发到接收方,而接收方则处理接收到的数据并做出相应的响应。下面是一个简单的示例代码:

package main

import (
    "encoding/json"
    "fmt"
    "net"
)

type Data struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func main() {
    sendAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
    if err != nil {
        fmt.Printf("Error resolving UDP address: %s\n", err.Error())
        return
    }

    conn, err := net.DialUDP("udp", nil, sendAddr)
    if err != nil {
        fmt.Printf("Error dialing UDP: %s\n", err.Error())
        return
    }

    defer conn.Close()

    data := &Data{
        ID:   1,
        Name: "Alice",
    }

    dataBytes, err := json.Marshal(data)
    if err != nil {
        fmt.Printf("Error marshalling JSON data: %s\n", err.Error())
        return
    }

    _, err = conn.Write(dataBytes)
    if err != nil {
        fmt.Printf("Error writing UDP data: %s\n", err.Error())
        return
    }
}

  在上面的示例代码中,我们使用了net包中的DialUDP函数向指定的目标地址发送UDP数据包。我们首先需要将给定的地址解析为一个net.UDPAddr类型的变量,这个变量包含地址和端口号。然后,我们使用DialUDP函数创建一个UDP连接,它返回一个net.UDPConn类型的变量。我们可以使用它来发送数据包。

  在代码的后面,我们创建了一个Data类型的结构体,这个类型包含ID和Name两个字段。然后,我们使用json.Marshal函数将Data类型的值序列化为一个JSON字节数组。最后,我们使用UDP连接的Write方法将字节数组发送到目标地址。

  接下来,让我们看一下接收方的代码示例:

 
package main

import (
    "encoding/json"
    "fmt"
    "net"
)

type Data struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func main() {
    receiveAddr, err := net.ResolveUDPAddr("udp", ":8000")
    if err != nil {
        fmt.Printf("Error resolving UDP address: %s\n", err.Error())
        return
    }

    conn, err := net.ListenUDP("udp", receiveAddr)
    if err != nil {
        fmt.Printf("Error listening UDP: %s\n", err.Error())
        return
    }

    defer conn.Close()

    buf := make([]byte, 1024)

    for {
        n, _, err := conn.ReadFromUDP(buf)
        if err != nil {
            fmt.Printf("Error reading UDP data: %s\n", err.Error())
            continue
        }

        data := &Data{}
        err = json.Unmarshal(buf[:n], data)
        if err != nil {
            fmt.Printf("Error unmarshalling JSON data: %s\n", err.Error())
            continue
        }

        fmt.Printf("Received data: ID=%d, Name=%s\n", data.ID, data.Name)
    }
}

  

在上面的示例代码中,我们使用了net包中的ListenUDP函数来监听UDP端口。和发送方代码一样,我们需要先将接收地址解析为一个net.UDPAddr类型的变量。然后,我们使用ListenUDP函数创建一个UDP监听器,它返回一个net.UDPConn类型的变量。我们可以使用它来接收UDP数据包。

在代码的后面,我们创建了一个缓冲区buf,并使用ReadFromUDP函数读取UDP连接中的数据包。ReadFromUDP函数返回接收到的字节数和数据包来源的*net.UDPAddr类型的变量。最后,我们使用json.Unmarshal函数将接收到的JSON字节数组反序列化为Data类型的值,并输出其中的ID和Name字段。

<iframe style="display: none !important"></iframe>

标签:UDP,err,fmt,转发,golang,Error,Go,net,data
From: https://www.cnblogs.com/cxy2020/p/17932770.html

相关文章

  • 【golang】Go语言中interface类型怎么使用
    1、Go语言中interface类型的定义 在Go语言中,interface类型是一个抽象的类型,它是一组方法签名的集合,只要某个类型实现了这些方法,它就属于该interface类型。在Go语言中定义一个interface类型的方法,需要使用interface关键字。下面是interface类型的完整定义方式:type interfac......
  • go-使用通道模拟抢到活动
    packagemainimport( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "math/rand" "sync" "time")//用户结构体typeUserstruct{ Idint Namestring Telstring Addressstring}......
  • 【Django进阶】djangorestframework-jwt使用
    简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资......
  • MongoDB Oplogs 到底都记录了什么 与 智者老冯
    最近董宇辉的事情,让我意识到,如果光一味的搞技术,那么对于人生和生活是不完整的,后序在撰写一些技术文章的时候,会带有一些对于当前热点事件的一些感触和反思,也希望能找到一些有同样想法的人,终究人生的道路是孤独的,如果在孤独中能找到一些人能对你有一些共鸣,那是一件幸福的事情。这里先......
  • 串口接收与转发
    STM32F107的内核是ARMCortex-M3,主频是72MHz.RAM是20K的SRAM,ROM是64K的FLASH。供电范围是2.0~3.6V,标准是3.3V.STM32是ST公司基于ARM公司生产的Cortex-M内核这个MCU根据自身需要完善外围电路所开发的32位单片机。ARM生产的内核有Cortex-A系列,Application,手机领域&苹果基于ARM架......
  • Golang channel的关闭
    使用内置函数close可以关闭channel,当channel关闭后,就不能再向channel写数据了,但是仍然可以从channel中读取数据。一旦将channel关闭了,只能读不能写。相当于关闭管道就数据不能进入到队列里面了,只能进行读操作,只读不写。channel支持for-range的方式进行遍历,请注意两个细节(1)在遍历时,......
  • 超时控制:Go语言下的网络请求与时间赛跑
    开场白:在互联网的世界里,我们经常要与各种API打交道。有时,这些API可能会因为各种原因而变得“慢条斯理”,这时,超时控制就显得尤为重要了。今天,我们就来聊聊如何在Go语言中实现HTTP请求的超时控制,与时间赛跑!知识点一:了解超时控制的必要性想象一下,当你正在等待一个重要的API响应时,如果......
  • 跨域请求:Go语言下的“通天大道”
    开场白:嘿,各位Go语言的爱好者们,你们是否曾经遇到过这样的困扰:当你的Go应用试图与另一个域的API进行交流时,突然跳出一个“未允许的跨域请求”的警告?别担心,今天,我们将一起在这条“通天大道”上漫步,解决跨域的困扰!知识点一:何为跨域问题?简单来说,当你在浏览器中访问一个网页,该网页试图从......
  • HTTP代理服务器:Go语言下的“网络翻译官”
    开场白:在这个全球化的网络时代,有时我们需要一个“翻译官”来帮助不同系统、不同语言进行交流。今天,我们就来探讨如何使用Go语言,轻松实现这样一个角色——HTTP代理服务器,让我们的网络请求更加畅通无阻!知识点一:什么是HTTP代理服务器?想象一下,你是一名只会说中文的游客,身处一个只会说英......
  • 处理HTTP错误响应:Go语言中的稳健之道
    开场白:在Web开发中,HTTP错误响应是不可避免的一部分。当请求无法成功完成时,服务器会返回一个错误响应。今天,我们将深入探讨如何在Go语言中优雅地处理这些HTTP错误响应。知识点一:HTTP错误响应的常见类型HTTP错误响应通常由状态码和相应的消息组成。常见的状态码包括:404(未找到)、500(内......