2016-01-10 26 views
0

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

我添加的代码:

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套接字开始只在第time.The第一次工作通缉工作这一部分之后,但在第二次它抛出这个错误:

错误:此插座已经被对方

结束,并指出这条线:

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个连接。

在此先感谢!

+0

只是为了方便参考,您能否发布完整的服务器代码? – dm03514

+0

@ dm03514 我不确定你是否需要它,当我将TCP套接字示例添加到我的整个程序中时,它工作正常,它只是在我添加了我的问题中提到的这些行后停止工作。开始 - 添加部分从此处开始,以 - ADDED PART ENDS HERE结尾。通过使用方法requestMatchDetails(data)和事件处理程序的方式未在我的代码中声明。我正在使用node-dota2(https://github.com/RJacksonm1/node-dota2) – ESipalis

回答

0

我意识到,每次套接字接收数据它会在这部分代码一个新的事件处理程序(不知道他们是怎么叫):接收数据

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个处理程序(旧的和新的)。旧处理程序试图写入已关闭的套接字,以便发生错误。我固定它通过使用“一次” handler.For例如,

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 
}); 

“曾经”的处理程序只能一次,它会破坏自身后。

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

相关问题