Код для отправки сообщения или файла по TCP в Ruby - PullRequest
0 голосов
/ 05 июня 2018

Я пытался пару дней с ограниченным успехом использовать TCP для связи двух программ ruby ​​на одном или разных компьютерах.

Я ищу, например, «клиент» и «сервер»'скрипты, которые будут работать сразу, как только я выберу порты, которые работают.

Код клиента, который, как мне кажется, работает, показан ниже.

Но у меня не работает серверс ним.

# Seems to work for some reason
require 'socket'

tcp_client=TCPSocket.new('localhost',1540)
while grab_string=tcp_client.gets
puts(grab_string)
end
tcp_client.close

Меня интересует самое простое из возможных решений, которое работает на моей машине.

Все, что нужно сделать, это отправить строку.Ответ, который я ищу, похож на this , но с ruby ​​вместо python.

Не стесняйтесь изменять код для клиента и сервера, оставив только половину головоломки.Я не уверен, работает ли он или нет.

Код сервера

# Server
require 'socket'

sock = TCPSocket.new('localhost', 1540)
sock.write 'GETHELLO'
puts sock.read(5) # Since the response message has 5 bytes.
sock.close

Используя код, предложенный kennycoc, я получаю следующее сообщение об ошибке

Server.rb:3:in `initialize': Only one usage of each socket address (protocol/network address/port) is normally permitted. - bind(2) for nil port 1540 (Errno::EADDRINUSE)
        from Server.rb:3:in `new'
        from Server.rb:3:in `<main>'

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

@ adjam вы не создали TcpServer, TCPSocket используется для создания клиентского сокета TCP / IP

Для создания TCP / IP-сервера вы должны использовать TCPServer

EX: Tcp / ip Код сервера:

require 'socket'
server = TCPServer.open(2000)
client = server.accept # Accept client
while (response = client.gets) # read data send by client
 print response
end

Tcp / ip Код клиента:

require 'socket'
client = TCPSocket.open('localhost', 2000)
client.puts "hello"
client.close;
0 голосов
/ 05 июня 2018

Взяв документацию из https://ruby -doc.org / stdlib-2.5.1 / libdoc / socket / rdoc / Socket.html , вы, похоже, ищете что-то вроде этого:

require 'socket'
server = TCPServer.new(1540)
client = server.accept
client.puts "GETHELLO"
client.close
server.close

В целом, если вы хотите, чтобы сервер был доступен для нескольких клиентов для запроса данных, у вас был бы цикл, работающий как

loop do
  client = server.accept
  client.puts "gethello"
  client.close
end
...