如何解决Ruby 客户端-服务器套接字拥塞
我正在使用 TCP 套接字制作游戏客户端-服务器,一切都很好,但是当我用 10 个机器人客户端+我使用官方客户端进行模拟一段时间后,它变得拥挤时,机器人只发送随机数据,例如: "GET_PLAYER_INFO" 表示服务器返回一串 ~247 个字符和另外 3 个每一个 ~20 个字符的字符串。
代码如此之多,我编写了一个简单的代码,却出现了同样的问题:
server.rb
require 'socket'
require 'json'
PORT = 8888
def send_to_all(msg)
for client in @clients.values
client.puts(msg)
end
end
@server = TCPServer.new("0.0.0.0",PORT)
@clients = {}
@clients_id = 1
loop do
socket = @server.accept
id = @clients_id
@clients[id] = socket
@clients_id += 1
puts "Welcome: #{id}"
Thread.new(id) do |client_id|
client = @clients[client_id]
client.puts({'id': client_id}.to_json)
loop do
begin
data = client.gets
rescue
break
end
if data != nil
data = data.chomp
send_to_all({'id': client_id,'message': "#{data}"}.to_json)
else
break
end
end
puts "Bye: #{client_id}"
@clients.delete(client_id)
end
end
@server.close
client.rb
require 'socket'
require 'json'
HOST = "localhost"
PORT = 8888
socket = TCPSocket.new(HOST,PORT)
id = JSON.parse(socket.gets.chomp)['id']
Thread.new(socket) do |server|
loop do
begin
data = server.gets
if data != nil
data = JSON.parse(data.chomp)
if data['id'] == id
puts "#{data['id']}: #{data['message']}"
end
else
break
end
rescue
end
end
puts "Broken"
end
loop do
string = gets.chomp
if %w{q quit exit close}.include?(string.downcase)
break
else
socket.puts string
end
end
socket.close
clients.rb
require 'socket'
require 'json'
HOST = "localhost"
PORT = 8888
CLIENTS = 10
WORDS = [
"a" * 24,"b" * 17,"c" * 22,"d" * 256
]
CLIENTS.times do
socket = TCPSocket.new(HOST,PORT)
socket.puts ""
Thread.new(socket) do |server|
puts WORDS.sample
begin
loop do
server.gets
server.puts WORDS.sample
sleep 0.1
end
rescue
puts "ERROR"
end
end
end
loop do
count = Thread.list.size
puts count
if count == 1
break
end
sleep 1
end
服务器将从客户端接收数据并将其发送回所有客户端。
客户端会从服务器读取数据并且什么都不做,然后会向服务器发送一些随机消息。
只需运行 server.rb、clients.rb 然后运行 client.rb 它会读取你的键盘所以输入一些东西并按 [Enter] 然后它会将它发送到服务器,然后服务器将它发送回所有客户端,所以client.rb 检查消息是否是您的并将其打印在控制台中,否则将从其他客户端读取数据但不会在控制台中打印,继续执行此操作,一段时间后您键入内容并将其发送到服务器,会很拥挤,以至于您将无法在控制台中收到要打印的信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。