无法向TCP客户端发送响应

时间:2013-09-10 14:19:36

标签: node.js tcp

我有一个TCP服务器,代码如下:

// Start a TCP Server
require('net').createServer(function (socket) {

  // Handle incoming messages from clients.
  socket.on('data', function (data) {
    console.log("received:" + data);

    // Do something with the data
    //...

    // Send result to client
    socket.write('OK');          // Code added which make the server crash
  });
}).listen(10000);

每次客户端连接时,服务器都会从套接字中检索数据并对其进行处理。如果我不尝试向客户端发送响应,则运行良好。

如果我添加'socket.write(“ok”);'代码行我得到以下错误(似乎套接字已经关闭?):

“的MemoryUsage”:{ “RSS”:22474752, “heapTotal”:16571136, “heapUsed”:7168552}}, “OS”:{ “loadavg”:[1.25634765625,1.111328125,1.00341796875], “运行时间”:185009 }, “跟踪”:[{ “塔”:11, “文件”: “net.js”, “功能”: “errnoException”, “行”:884, “方法”:空, “天然”:假} ,{ “列”:19, “文件”: “net.js”, “功能”: “TCP.onread”, “行”:539, “方法”: “onread”, “天然的”:假}], “stack”:[“Error:read ECONNRESET”,“at errnoException(net.js:884:11)”,“at TCP.onread(net.js:539:19)”],“level”:“error” ,“message”:“uncaughtException:read ECONNRESET”,“timestamp”:“2013-09-10T14:11:29.354Z”}

知道什么是错的?

修改

我使用以下ruby代码来模拟客户端,我应该为每个打开的套接字使用一个线程吗?

...
# Send test data to server
[1,2,3,4,5].each do |data|
  puts "sending #{data}"
  s = TCPSocket.open(host, port)
  s.puts data 
end

1 个答案:

答案 0 :(得分:2)

您的ruby客户端完成执行并在将消息发送到您的服务器后退出。它不期望服务器有任何响应,因此它不会等待。您只需像这样修改客户端:

  s = TCPSocket.open(host, port)
  s.puts data 
  puts s.read(2) //wait for response

读取是阻塞的,因此客户端不会发送下一条消息,直到它从循环中的服务器接收到某些内容。要并行发送数据,你必须a)在ruby中使用非阻塞I / O(不知道如何)或b)将它包装在为每个客户端生成线程的包装器中。