新的tcp套接字时出现“通过对等方重置连接”错误

时间:2011-07-08 14:20:04

标签: ruby multithreading sockets

以下代码旨在制作TCP服务器和客户端。 但是当客户端线程的数量太大(例如:100个线程)时,客户端会收到“按对等方重置连接”错误。我无法找出错误的原因,所以我需要你的帮助。

服务器:

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-

require "socket"
crab = TCPServer.new "127.0.0.1", 8087
while browser = crab.accept
  Thread.new browser do | client |
    puts client.gets
    client.puts "hello"
    client.close
  end
end

客户端:

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-
require "socket"
threads_arr = []
ARGV[0].to_i.times do    
  t = Thread.new do
    client = TCPSocket.new "127.0.0.1", 8087
    client.puts "hello"
    client.gets
    client.close
  end  
  threads_arr << t
end
threads_arr.each do | t |
  t.join
end

管环境:

Mac OS X 10.6.8

ruby​​ 1.8.7p174 / ruby​​ 1.9.2p180

2 个答案:

答案 0 :(得分:3)

EventMachine这样做会更容易吗?线程只会在它开始引起麻烦之前进行扩展。当接收到大量连接时,EventMachine还可以更好地处理负载。

您可能需要检查您的接受队列是否足够大。默认值类似于5个挂起的连接,如果无法足够快地确认它们,则可能会将它们丢弃。

答案 1 :(得分:0)

套接字连接应该在一侧关闭 - 或仅关闭客户端或仅关闭服务器。在您的示例中,如果服务器关闭连接第一个客户端在尝试关闭连接时收到异常 删除例如客户端中的close调用:

  t = Thread.new do
    client = TCPSocket.new "127.0.0.1", 8087
    client.puts "hello"
    client.gets
  end