繁体   English   中英

Ruby TCPSocket不断丢失连接

[英]Ruby TCPSocket keeps losing connection

我有一个客户端和服务器。 我启动服务器,并运行客户端,并且第一次运行良好。 第二次运行客户端(不重新启动服务器)时,客户端似乎挂起。 谁能看到错在哪里?

我有一个客户:


# Code example originated from p069dtclient.rb at http://rubylearning.com/satishtalim/ruby_socket_programming.html
    require 'socket'
    x = 0;

    streamSock = TCPSocket.new( 'localhost', 20000 )
    while x < 10
      streamSock.send( "Hello #{x}",0 )
      str = streamSock.recv( 100 )
      puts "#{x} " + str
      x=x+1
    end
    streamSock.close

和服务器:


    # p068dtserver.rb
    require "socket"
    dts = TCPServer.new('localhost', 20000)
    s = dts.accept
    print(s, " is accepted\n")
    loopCount = 0;
    loop do
      Thread.start(s) do
      loopCount = loopCount + 1
        lineRcvd = s.recv(1024)
        if ( !lineRcvd.empty? )
          puts("#{loopCount} Received: #{lineRcvd}")
          s.write(Time.now)
        end
      end
    end
    s.close
    print(s, " is gone\n")

与服务器的每个连接都需要一个单独的接受调用才能被接收。 发生的情况是,您首先接受,使用它,然后在使套接字保持监听状态的同时有效终止。 这意味着将打开连接,但不接受连接,因此它们会按照您的描述挂起。

使用更强大的服务器框架可能会更好。 EventMachine( http://rubyeventmachine.com/ )学习起来有些棘手,但它远比滚动您自己的解决方案强大。

这是一个可能有帮助的快速修复:

require "socket"
dts = TCPServer.new('localhost', 20000)
while (s = dts.accept)
  print(s, " is accepted\n")
  loopCount = 0;
  loop do
    Thread.start(s) do
    loopCount = loopCount + 1
      lineRcvd = s.recv(1024)
      if ( !lineRcvd.empty? )
        puts("#{loopCount} Received: #{lineRcvd}")
        s.write(Time.now)
      end
    end
  end
  s.close
  print(s, " is gone\n")
end

现在,accept调用被包装在一个循环中,因此可以处理多个连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM