Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带Node.js客户端的Ruby UNIXServer_Ruby_Node.js_Sockets_Client Server_Unix Socket - Fatal编程技术网

带Node.js客户端的Ruby UNIXServer

带Node.js客户端的Ruby UNIXServer,ruby,node.js,sockets,client-server,unix-socket,Ruby,Node.js,Sockets,Client Server,Unix Socket,我有一个使用Unix套接字的Ruby服务器: require 'socket' server = UNIXServer.new('/tmp/ciccio.sock') loop do sock = server.accept loop do begin data = sock.recv(1024) data = "DO SOMETHING -> #{data}" sock.write(data) sock.flush

我有一个使用Unix套接字的Ruby服务器:

require 'socket'

server = UNIXServer.new('/tmp/ciccio.sock')
loop do
  sock = server.accept
  loop do
    begin
      data = sock.recv(1024)
      data = "DO SOMETHING -> #{data}"
      sock.write(data)
      sock.flush
    rescue Errno::EPIPE, Errno::ENOTCONN
      break
    end
  end
end
我有一个使用node.js api的JavaScript客户端:

问题在于,在服务器循环的第一次迭代中,
recv
接收到正确的字符串,服务器用字符串
data
回复客户机。但是在第二次迭代时,recv接收到空数据,于是一个无限循环开始了。。。服务器继续接收空数据并且
recv
不阻止

如果我使用像这样的ruby客户端,一切都很好

require 'socket'

sock = UNIXSocket.new('/tmp/ciccio.sock')
loop do
  sock.write('hello world!')
  data = sock.recv(1024)
  puts data
  sleep(10)
end
sock.close

您的客户端在连接、编写“hello world”并收到响应后关闭连接。现在,服务器正在对已关闭的套接字调用
recv
,该套接字将返回一个空字符串。由于您正在无限期地循环读取此套接字,因此它将永远不会将控制权返回到外部循环,以便为第二个客户端调用
accept
。客户端的ruby版本可以工作,因为它从不关闭与服务器的连接

在收到一个空字符串后中断内部循环应该可以得到你想要的

需要“套接字”
server=UNIXServer.new('/tmp/ciccio.sock')
环道
sock=server.accept
环道
开始
数据=sock.recv(1024)
如果data.empty,则中断?
data=“做事->{data}”
sock.write(数据)
短袜
营救错误号::EPIPE,错误号::ENOTCONN
打破
结束
结束
结束

另一个潜在问题是,服务器只能为单个客户端的单个连接提供服务,因为在当前连接结束之前,内环会阻止对
accept
的任何后续调用。

为什么要调用
client.end()
数据上
?是否应该在
end
上调用它?@mudasobwa我使用了doc的示例。问题是recv不阻塞,因此它只能返回在那一瞬间可用的内容,而这有时是空的。理查德·史蒂文斯是这方面的权威。读他的book@JohnLaRooy
recv
是阻塞调用,
recv\u nonblock
是非阻塞变量。当然,这假设在调用
recv
之前,文件描述符没有设置为
O_NONBLOCK
。我敢打赌情况并非如此,
recv
正在阻塞,但在连接完成后,
recv
将在关闭的套接字上被调用,因此将始终返回空字符串。“现在,您的服务器正在关闭的套接字上调用recv,该套接字将返回空字符串”当前位置这是我不理解的部分。谢谢
require 'socket'

sock = UNIXSocket.new('/tmp/ciccio.sock')
loop do
  sock.write('hello world!')
  data = sock.recv(1024)
  puts data
  sleep(10)
end
sock.close