【问题标题】:node.js TCP socket receive data and send out modified data works only for the first timenode.js TCP socket接收数据并发送修改数据仅在第一次工作
【发布时间】:2016-04-14 21:06:47
【问题描述】:

我想创建 node.js TCP 套接字,它接收数据,修改数据,然后将其发送回来。我使用这个答案作为我的例子:https://stackoverflow.com/a/24876432/1945451 它在这样的情况下工作得非常完美,但是在我之后添加我自己的代码来发送数据,它只在第一次工作。

我添加的代码:

conn.on('data', function(data) {
    console.log('ECHO_SERVER: CONN: GOT DATA: ' + data);
    //ADDED PART STARTS HERE
    data = Number(data);
    api.requestMatchDetails(data);
    api.on("matchDetailsData", function (matchId, matchData) {
        var modData = "..." + matchData.match.something + "...";
        conn.write(modData);
    });
    //ADDED PART ENDS HERE
});

添加这部分代码后,TCP 套接字仅第一次开始工作。第一次它按要求工作,但第二次它抛出此错误:

错误:此套接字已被对方结束

并指出这一行:

conn.write(modData);

客户端部分的作用:

1. Opens connection
2. Sends data
3. Waits for response
4. Closes socket.

我希望服务器部分做什么:

1. Wait for connection
2. Accept connection
3. Receive data
4. Modify data
5. Send back data.
6. Close connection
7. Wait for more connections.

服务器部分只需一秒钟即可完成所有操作,因此我可以保证一次连接不会超过 1 个。

提前致谢!

【问题讨论】:

  • 仅供参考,能否请您发布完整的服务器代码?
  • @dm03514 我不确定你是否需要它,当我将 TCP 套接字示例添加到我的整个程序中时它运行良好,在我添加了我的问题中提到的这些行后它就停止了工作。从- 添加的部分从这里开始并以 - 添加的部分在这里结束。顺便说一下,我的代码中没有声明使用的方法 requestMatchDetails(data) 和事件处理程序。我正在使用 node-dota2(github.com/RJacksonm1/node-dota2)

标签: javascript node.js sockets tcp server


【解决方案1】:

我意识到每次套接字接收数据时,它都会在这部分代码中创建一个新的事件处理程序(不确定它们是如何被调用的):

conn.on('data', function(data) {
    console.log('ECHO_SERVER: CONN: GOT DATA: ' + data);
    //ADDED PART STARTS HERE
    data = Number(data);
    api.requestMatchDetails(data);
    api.on("matchDetailsData", function (matchId, matchData) {
        var modData = "..." + matchData.match.something + "...";
        conn.write(modData);
    });
    //ADDED PART ENDS HERE
});

每次它接收到数据时都会创建这个处理程序:

api.on("matchDetailsData", function (matchId, matchData) {
    var modData = "..." + matchData.match.something + "...";
    conn.write(modData);
});

所以当连接结束并且我结束套接字时,仍然存在这个事件处理程序,所以在第二次连接发生并发送更多数据后,该行再次执行:

api.requestMatchDetails(data);

调用 2 个处理程序(旧的和新的)。旧处理程序尝试写入已关闭的套接字,因此发生错误。我通过使用“一次”处理程序来修复它。例如,

conn.once('data', function(data) {
    console.log('ECHO_SERVER: CONN: GOT DATA: ' + data);
    //ADDED PART STARTS HERE
    data = Number(data);
    api.requestMatchDetails(data);
    api.on("matchDetailsData", function (matchId, matchData) {
        var modData = "..." + matchData.match.something + "...";
        conn.write(modData);
    });
    //ADDED PART ENDS HERE
});

“once”处理程序只工作一次,并且在它自己销毁之后。

我与Javascript或其术语不太相似,所以我不知道如何调用某些东西,我尽力解释,所以如果其他人有同样的问题,他们可以理解我的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2012-11-08
    • 2013-01-17
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多