【问题标题】:UDP communication varies depending on implementation languageUDP 通信因实现语言而异
【发布时间】:2015-04-11 22:01:23
【问题描述】:

简介

我对通过 UDP 通信但不需要任何端口转发的多人游戏感兴趣。所以我试图通过自己的实现来实现这一点。 我不需要点对点网络。我只希望单个客户端可以向服务器发送消息,然后服务器可以向所有其他客户端发送消息。

服务器实现(Node.js)

服务器在 Node.js 中实现,如下所示:

var socket = require( "dgram" ).createSocket( "udp4" );

socket.on( "message", function ( message, requestInfo ) {

        var response = new Buffer("Welcome " + requestInfo.address + ":" + requestInfo.port);

        socket.send(response,0,response.length,requestInfo.port,requestInfo.address,
            function( error, byteLength ) {
                console.log( "Welcomed " + requestInfo.address + ":" + requestInfo.port );
            }
        );
    }
);

socket.on( "error", function ( error ) {
        socket.close();
    }
);

socket.on( "listening", function () {
        var address = socket.address();
        console.log("Listening on " + address.address + ":" + address.port);
    }
);

socket.bind(3000);

所以服务器正在监听端口 3000。我在将服务器连接到 Internet 的 rooter 上转发了这个端口。 (使用UDP打孔技术时有点像集合服务器)

客户端实现(Node.js)

其中一个客户端也在 Node.js 中实现,如下所示:

var socket = require( "dgram" ).createSocket( "udp4" );

socket.on( "message", function ( message, requestInfo ) {
        console.log(requestInfo.address + ":" + requestInfo.port + ": " + message);
    }
);

socket.on( "error", function ( error ) {
        socket.close();
    }
);

socket.on( "listening", function () {

        var address = socket.address();

        console.log( "Listening on " + address.address + ":" + address.port );

        var response = new Buffer("Hi Dude! Here is " + address.address + ":" + address.port);

        var host = "WWW.XXX.YYY.ZZZ";
        var port = 3000;

        socket.send(response,0,response.length,port,host,
            function( error, byteLength ) {
                console.log( "Introduced to " + host + ":" + port);
            }
        );
    }
);

socket.bind(3001);

当这个 Node.js 脚本启动时,会向服务器发送一条“欢迎”消息。然后服务器回答这个消息。 所有这些都工作得很好。它还适用于 3G 连接。

客户端实现 (C#)

由于我想将它与 Unity3D 一起使用,我需要在 C# 中实现客户端。所以我使用了 MSDN 中的这个例子:MSDN UDP Documentation

问题

现在这是我无法理解的。当我使用 Node.js 客户端时,服务器会从我在 Node.js (3001) 中定义的端口接收到一条消息。当我使用 C# 客户端时,端口似乎是随机的。这导致了一个问题,我永远不知道我必须用 C# 客户端监听哪个端口。

所以我只看到来自服务器的消息来自 Node.js 客户端,而不是 C# 客户端。

我还了解到,专用网络和公共网络中的端口号不一样。使用 Node.js 客户端,它们似乎是这样的。

问题

那么我是理解整个 UDP 通信有问题还是我只是实现了错误?

【问题讨论】:

  • UdpClient 构造函数有一个使用端口号的重载。你试过设置吗?
  • 发布您的 C# 示例代码可能会有所帮助。
  • @Praveen Paulose 谢谢!你的评论真的帮了我很多。我什至已经在接收器线程中使用了构造函数。但是我没有在另一个线程中选择端口。我通过仅使用一个端口为 3001 的 UdpClient 对象来解决此问题。
  • @Benjamin Gruenbaum 您可以在名为“MSDN UDP 文档”的链接下找到 C# 代码示例
  • @Praveen Paulose 我将其标记为答案!再次非常感谢您!

标签: javascript c# node.js sockets networking


【解决方案1】:

UdpClient 有一个使用端口的构造函数重载。您可以使用此重载来指定端口号。

UdpClient udpClient = new UdpClient(3001);

将构造函数留空或将其设置为 0 会使 UdpClient 选择一个随机的可用端口号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多