2016-01-10 25 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或其術語,所以我不知道如何調用某些東西,我盡力解釋,所以如果別人有同樣的問題,他們可以理解我的答案。

相關問題