2011-07-08 100 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

相關問題