首页 文章

无法向TCP客户端发送响应

提问于
浏览
0

我有一个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”, “天然的”:假}], “堆” :[“错误:读取ECONNRESET”,“在errnoException(net.js:884:11)”,“在TCP.onread(net.js:539:19)”,“level”:“error”,“message “:”uncaughtException:读取ECONNRESET“,”timestamp“:”2013-09-10T14:11:29.354Z“}

什么是错的?

EDIT

我使用以下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 回答

  • 1

    您的ruby客户端完成执行并在将消息发送到您的服务器后退出 . 它不期望服务器的任何响应,所以它不会等待 . 您只需修改您的客户端,如下所示:

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

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

相关问题