2011-07-08 110 views
3

下面的代码旨在创建TCP服务器和客户端。 但是,当客户端线程的数量太大(例如:100个线程)时,客户端会收到“由对等方重置连接”错误。我找不到错误的原因,所以我需要你的帮助。当新的TCP套接字发生“对等连接重置”错误

服务器:

#!/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

红宝石1.8.7p174 /红宝石1.9.2p180

回答

3

这在EventMachine会更容易吗?只有在开始引起麻烦之前,线程才会扩展。 EventMachine在接收大量连接时也能更好地处理负载。

您可能需要检查您的接受队列是否足够大。默认值是5个未决连接,如果他们不能很快得到确认,你可能会丢掉它们。

+0

我看到的,问题是,积压太小。 – lululau

0

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

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

感谢tadman的回答,我发现问题是积压太小。当TCPServer.new之后插入“crab.listen 100”时,问题就解决了。 – lululau

相关问题