Golang编写的UDP客户端无法接收来自服务器的消息

2024-02-15

我写了一个Java客户端,它向广播地址发送消息。

我还编写了一个Java服务器,它接受所有发送的消息并将消息发送回客户端。

现在我想尝试在 Go 中做同样的事情,只是为了获得一些经验。服务器工作正常,正在接收消息并对 Java 客户端做出响应。

但是我的 Go 客户端仅向 Go/Java 服务器发送消息,但没有收到任何返回的消息。根据wireshark,消息被发送回正确的IP和端口,但显然该端口无法访问。

我的代码如下: 去服务器:

package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    //Resolving address
    udpAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:8888")

    if err != nil {
        log.Println("Error: ", err)
    }

    // Build listining connections
    conn, err := net.ListenUDP("udp", udpAddr)

    defer conn.Close()

    if err != nil {
        log.Println("Error: ", err)
    }

    // Interacting with one client at a time
    for {
        fmt.Println(">>>Ready to receive broadcast packets!")

        // Receiving a message
        recvBuff := make([]byte, 15000)
        _, rmAddr, err := conn.ReadFromUDP(recvBuff)

        if err != nil {
            panic(err)
        }

        fmt.Println(">>>Discovery packet received from: " + rmAddr.String())
        fmt.Println(">>>Packet received; data: " + string(recvBuff))

        // Sending the same message back to current client
        conn.WriteToUDP(recvBuff, rmAddr)

        fmt.Println(">>>Sent packet to: " + rmAddr.String())

} }

去客户端:

package main

import (
    "fmt"
    "log"
    "net"
    "os"
)

func main() {
    service := "158.129.239.255:8888"

    // Resolving Address
    RemoteAddr, err := net.ResolveUDPAddr("udp", service)

    // Make a connection
    conn, err := net.DialUDP("udp", nil, RemoteAddr)

    defer conn.Close()

    // Exit if some error occured
    if err != nil {
        log.Fatal(err)
        os.Exit(1)
    }

    // write a message to server
    message := []byte("message")

    _, err = conn.Write(message)
    fmt.Println(">>> Request packet sent to: 158.129.239.255 (DEFAULT)")

    if err != nil {
        log.Println(err)
    }

    // Receive response from server
    buf := make([]byte, 15000)
    amountByte, remAddr, err := conn.ReadFromUDP(buf)

    if err != nil {
        log.Println(err)
    } else {
        fmt.Println(amountByte, "bytes received from", remAddr)
    }

}

Java客户端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;

public class BroadcastUDPClient {

    public static void main(String[] args) {
        // Find the server using UDP broadcast
        try {
            //Open a random port to send the package
            DatagramSocket sendSD = new DatagramSocket();
            sendSD.setBroadcast(true);

                byte[] sendData = "message".getBytes();

            //Try the 255.255.255.255 first
            try {
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("158.129.239.255"), 8888);
                sendSD.send(sendPacket);
                System.out.println(">>> Request packet sent to: 158.129.239.255 (DEFAULT)");
            } catch (Exception e) {
            }

            //Wait for a response
            byte[] recvBuf = new byte[15000];
            DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
            sendSD.receive(receivePacket);

            //We have a response
            System.out.println(">>> Broadcast response from server: " + receivePacket.getAddress().getHostAddress());
            String message = new String(receivePacket.getData()).trim();
            System.out.println(">>> Message Body: " + message);

            //Close the port!
            sendSD.close();
        } catch (IOException ex) {
            Logger.getLogger(BroadcastUDPClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

我的 Go 客户端做错了什么?


即使您只打算从连接发送 UDP 数据包,您通常也希望使用ListenUDP https://golang.org/pkg/net/#ListenUDP创建连接,并使用ReadFromUDP and WriteToUDP方法。

当你使用DialUDP,它创建一个“已连接”的 UDP 套接字,带有隐式远程端点,它将过滤传入的数据包。来自Linuxconnect手册页:

如果套接字 sockfd 是 SOCK_DGRAM 类型,则 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang编写的UDP客户端无法接收来自服务器的消息 的相关文章

  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • Bazel 构建缺少严格的依赖关系

    我正在尝试使用 brazel 构建 Go 应用程序 它是一个现有的私有 GitHub 存储库 位置如下 github xyz com repo name 我正在研究 我的目标是从 main go 文件创建一个二进制文件 该文件的方法依赖于其
  • vscode 中的调试不会在断点处停止,调试器启动时显示“无法找到文件...”

    乌班图 vscode 1 62 1 去1 17 3 vscode go 扩展 v0 29 0 深入研究 v1 7 1 我是 vscode 和 Go 的新手 我有多年在 Eclipse 中调试 Java 应用程序的经验 我构建了一个小型多模块
  • Laravel 广播频道 - 检查连接

    我在文档或搜索中找不到这个 也许有人有一些提示 我正在尝试检查后端存在通道上有多少连接 我可以用 Echo 来检查前端是否正常 如下所示 Echo join chat here users gt users length is the pr
  • 优化 golang 中的数据结构/字对齐填充

    与我在 C 中学到的类似 我相信填充导致了两个结构体实例大小的差异 type Foo struct w byte 1 byte x byte 1 byte y uint64 8 bytes type Bar struct x byte 1
  • Go API 在 html 中显示 swagger api 规范 (json) (Swagger UI)

    我有一个服务于特定端口的应用程序 gorilla mux 我也有一个 json 文件形式的 swagger API 规范 是否有任何 go API 可以像 spring boot 一样从 JSON 文件生成 swagger UI 定义 我正
  • Golang - 更改 Windows 上的构建工作路径

    我正在使用 SublimeText3 GoSublime 插件 在 Windows 8 上测试简单的 Go 程序 go run v example go 在运行之前它正在内部编译 应用程序数据 本地 温度 目录 我的防病毒程序认为这是病毒并
  • SO_BINDTODEVICE Linux 套接字选项的问题

    我有一台带有两个网卡的电脑 一 eth0 用于 LAN 互联网 另一个用于与一个微控制器设备进行 UDP 通信 微控制器有一个 IP 192 168 7 2 和一个 MAC 地址 第二个电脑网络适配器 eth1 有 192 168 7 1
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 取消用户特定的 goroutine [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个应用程序 网络应用程序 允许用户使用 twitter oauth 登录并提供自动推文删除功能 用户登录到 Web 应用程序后
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 无法通过键获取 Gorilla 会话值

    我无法通过这种方式从会话中获取价值 它是nil session initSession r valWithOutType session Values key 完整代码 package main import fmt github com
  • 如何将未知字段类型的数据解组为 JSON

    我有这些 结构 type Results struct Gender string json gender Name struct First string json first Last string json last json nam
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • 从 Docker 容器发送多播数据包(到多播组)

    我有一个通过 UDP 多播发送消息的应用程序 我一直试图将其放在 docker 下 我在尝试从 Docker 容器发送多播数据包时遇到了很大的阻力 我已经能够通过 net host运行 docker 容器的选项 然而 我想坚持使用桥接配置
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • Golang中如何获得100%的代码覆盖率? [复制]

    这个问题在这里已经有答案了 我无法获得 100 的代码覆盖率 因为我无法在 Golang 中测试 Fatals 我发现了一些问答 包括this one https stackoverflow com questions 30688554 h
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle

随机推荐

  • 是否可以将单个文件从一个 SVN 存储库迁移到另一个存储库,同时保留历史记录?

    我在我的个人 SVN 存储库中启动了一个小应用程序 它引起了足够的兴趣 值得将开发转移到共享组存储库 可以将应用程序 仅单个文件 及其历史记录迁移到组存储库吗 查看 svnadmin dump svnadmin load 和 svndump
  • Saxon 与 Visual Studio 2010 - 有没有办法使用调试器?

    我们花费了越来越多的时间来应对 Microsoft XSLT 1 0 处理器的限制 我认为现在是开始使用 XSLT 2 0 的时候了 撒克逊似乎是一个不错的选择 问题是 Visual Studio 集成的 XSLT 调试器非常棒 没有人想停
  • NSString stringWithFormat 使用制表符而不是空格

    您可以看到我在字符串后添加了 40 个空格 但它从索引 0 开始 我可以用制表符 t 而不是空格 做同样的事情吗 NSString firstString NSString stringWithFormat stringToWrite st
  • QML 中的 if 语句

    对于 QT 和 QML 来说是全新的 我试图根据两个属性双精度之间的关系设置矩形的颜色callValue and handRaiseXBB 但我收到错误 意外的标记如果 and 需要一个限定名称 id 谁能告诉我我做错了什么 import
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • 如何在 PHP 中模拟单精度浮点运算?

    我需要将一个简单的 C 程序移植到 PHP 目前我们必须启动该过程并解析其输出 程序很琐碎 但是对于算法的使用很重要float因为错误会累积起来 结果会大相径庭 C 示例 include
  • 强制 jQuery UI Datepicker 显示在输入字段下方

    我有一个页面 其中包含一个表单和几个字段 我的问题如下 我试图强制 jQuery UI 日期选择器显示在输入字段下方 当我单击输入字段时 我希望该字段也滚动到页面顶部 我想我有这个工作 这是我的 jQuery JQUERY document
  • 如何使用 getMouse() 捕获右键单击事件

    我正在尝试使用graphics py 编写用户图形界面 问题是如何捕获右键事件呢 看来函数 getMouse 只能返回鼠标左键单击的位置作为 Point 对象 from graphics import def main win GraphW
  • 使用 servlet 将动态图像传递到 JSP

    我有一个桌面应用程序 可以创建图形 2D 对象 将其粘贴在面板中并进行绘制 我正在尝试使用 servlet 和 jsp 将此应用程序转换为网页 我已经在网上阅读了两天 但无法理解如何做到这一点 我发现的每个例子似乎都遗漏了一个重要的部分 我
  • Teamcity 无法通过 nuget 安装软件包

    已解决 请参阅评论 我在 team city 有一个项目无法安装所需的软件包 这已经工作了一年多 但本周所有构建都开始失败 我的开发流程如下 我们使用github并使用Visual Studio进行本地开发 我们有一个 Windows te
  • 使用对象过滤嵌套数组

    我有一系列类别 每个类别实例都有优惠属性 class Category var offers Offer var title String var id Int class Offer var type String global vari
  • 从 eclipse 运行 Visual VM

    我正在尝试在 Eclipse kepler 中使用 Visual VM 调试 java 应用程序 我正在执行具有选择 Visual VM 作为启动器的主要方法的类 我已经按照中给出的说明配置了 Visual VMhttp blog idrs
  • Chrome 中的 CSS3 过渡不平滑

    我使用 CSS3 过渡根据鼠标悬停时的边距值对某些链接进行动画处理 它的动画效果符合预期 但 Chrome 中的动画并不像其他浏览器 如 Firefox IE10 那样流畅 在 Chrome 中 当我将鼠标悬停在链接上时 所有其他链接都会稍
  • 字符串文字和数组的地址

    int main char str1 Hi str2 Bye printf u u n str1 str1 int arr 5 1 2 3 4 5 printf u u arr arr 这里发生了什么 str and str给出不同的地址和
  • 如何修复 webkit-fake-url 的含义?

    当您尝试复制并粘贴到 Safari Web 浏览器时 浏览器会插入webkit fake url 在 Chrome 中 你可以这样做getAsFile 在剪贴板数据上读取图像 你能用 Safari 做类似的事情吗 不可以 目前无法在 Saf
  • 将 Azure Active Directory 用户添加到 Azure SQL 数据库

    我有一个 Azure SQL Server 可以通过 SSMS 进入其中 我还有一个 Azure Active Directory 其用户名为 电子邮件受保护 cdn cgi l email protection 我想添加此用户以拥有对我的
  • Spark Streaming kafka 偏移量管理

    我一直在做 Spark Streaming 工作 通过 kafka 消费和生成数据 我使用的是directDstream 所以我必须自己管理偏移量 我们采用redis来写入和读取偏移量 现在有一个问题 当我启动我的客户端时 我的客户端需要从
  • 一个通用的Windows应用程序如何拥有多个独立的窗口(如微软的应用程序“照片”)?

    我确实知道如何使用打开其他窗口TryShowAsStandaloneAsync 然而 如果原来的窗口是关闭的 TryShowAsStandaloneAsync失败 为什么 我不知道如何 复活 它 https stackoverflow co
  • libgdx 绘制汉字

    我喜欢在我的应用程序中打印中文文本 1 当我尝试这个时 屏幕将是空的 控制台没有错误 创建方法 FreeTypeFontGenerator gen new FreeTypeFontGenerator Gdx files internal f
  • Golang编写的UDP客户端无法接收来自服务器的消息

    我写了一个Java客户端 它向广播地址发送消息 我还编写了一个Java服务器 它接受所有发送的消息并将消息发送回客户端 现在我想尝试在 Go 中做同样的事情 只是为了获得一些经验 服务器工作正常 正在接收消息并对 Java 客户端做出响应