这段简单的Nodejs代码有什么问题么?

这段简单的Nodejs代码有什么问题么?

var host=“XXX.XXX.XX.XX”; var port=12345; var dgram = require(“dgram”); var server = dgram.createSocket(“udp4”); server.on(“message”, function (msg, rinfo) { console.log("client send: " + msg + " from " + rinfo.address + “:” + rinfo.port); var dgram2 = require(‘dgram’); var message = new Buffer(“i reviced”); var client = dgram2.createSocket(“udp4”); client.send(message, 0, message.length, rinfo.port, rinfo.address, function(err, bytes) { client.close(); }); });

server.on(“listening”, function () { var address = server.address(); console.log(“client connection” + address.address + “:” + address.port); });

server.bind(port,host);

//其中xx是服务器的IP 也就是外网的现在要求是内网连接之后 收到一信息 但是好像上面的代码不灵…


4 回复

这段Node.js代码的主要目的是创建一个UDP服务器来监听特定的IP地址和端口,并在接收到消息时发送响应。然而,代码中存在一些潜在问题和改进空间:

  1. 字符串引号不一致:代码中的字符串使用了混合的引号(如中文引号),这会导致运行时错误。应该统一使用英文引号。

  2. 重复引入模块:在处理每个消息时,代码中重复引入了dgram模块。这可以优化为仅在文件顶部引入一次。

  3. 错误处理缺失:在发送消息时没有错误处理逻辑,如果发生错误(例如目标主机不可达),程序将不会有任何反馈。

  4. 关闭客户端socket:虽然在发送数据后立即关闭了客户端socket,但更好的做法是在确保数据已成功发送后再关闭。

以下是改进后的代码示例:

var host = 'XXX.XXX.XX.XX';
var port = 12345;
var dgram = require('dgram');

var server = dgram.createSocket('udp4');

server.on('message', function (msg, rinfo) {
    console.log("client send: " + msg + " from " + rinfo.address + ":" + rinfo.port);

    var message = Buffer.from("i received");
    var client = dgram.createSocket('udp4');
    client.send(message, 0, message.length, rinfo.port, rinfo.address, function(err, bytes) {
        if (err) {
            console.error("Error sending message:", err);
        }
        client.close();
    });
});

server.on('listening', function () {
    var address = server.address();
    console.log("Server listening on " + address.address + ":" + address.port);
});

server.bind(port, host);

主要改进点:

  • 使用英文引号。
  • 在文件顶部仅引入一次dgram模块。
  • 添加了发送失败时的错误处理。
  • 确保在发送完成后才关闭客户端socket。

这些改进使代码更健壮、易于维护,并且能更好地处理可能出现的异常情况。


内网外网的网卡不一样的吧。绑定0.0.0.0 不要指定host

首先谢谢你的回答 大致 我修改了下代码 如下 var port=12345; var dgram = require(“dgram”); var server = dgram.createSocket(“udp4”); server.on(“message”, function (msg, rinfo) { var dgram2 = require(‘dgram’); var message = new Buffer(“aaaaa”); var client = dgram2.createSocket(“udp4”); client.send(message, 0, message.length, rinfo.port, rinfo.address, function(err, bytes) { client.close(); }); console.log("server got: " + msg + " from " + rinfo.address + “:” + rinfo.port); });

server.on(“listening”, function () { var address = server.address(); console.log("server listening " + address.address + “:” + address.port); }); server.bind(port);

另外的 我用C#模拟了一个客户端 如果是C#的服务端跟客户端互相发送是没问题的.

但是目前是node作为服务端 C#作为客户端 给node发是可以的 但是接收不到…

你的代码有几个问题需要修正:

  1. 字符串引号不一致:你在代码中使用了混合的引号(例如中文引号和英文引号),这会导致JavaScript解析错误。应该统一使用英文双引号或单引号。

  2. 变量作用域:在message事件处理函数内部重新定义dgram模块会导致不必要的资源占用。你应该直接使用外部已经定义的dgram模块。

  3. 错误处理:在发送UDP消息时,应该添加错误处理逻辑来捕获可能发生的错误。

  4. 关闭客户端socket:在发送完消息后立即关闭客户端socket可能是合理的,但如果客户端需要多次发送消息,则需要调整这部分逻辑。

以下是修改后的代码示例:

var host = "XXX.XXX.XX.XX";
var port = 12345;
var dgram = require("dgram");

var server = dgram.createSocket("udp4");

server.on("message", function(msg, rinfo) {
    console.log("Client sent: " + msg + " from " + rinfo.address + ":" + rinfo.port);

    var message = Buffer.from("I received");
    var client = dgram.createSocket("udp4");

    client.send(message, 0, message.length, rinfo.port, rinfo.address, function(err, bytes) {
        if (err) {
            console.error("Error sending message:", err);
        }
        client.close();
    });
});

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

server.bind(port, host);

关键点解释:

  • 使用英文双引号统一字符串格式。
  • 移除重复的dgram模块导入。
  • 添加发送消息时的错误处理。
  • 确保客户端socket在发送完成后正确关闭。

这些更改应能解决你的问题,并使你的UDP服务器能够正常接收和响应客户端的消息。

回到顶部