以下代码旨在制作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
答案 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