在 Ruby 中通过 TCP 发送消息或文件的代码

Code for sending a message or file over TCP in Ruby

几天来我一直在尝试使用 TCP 让两个 ruby 程序在相同或不同的机器上进行通信,但收效甚微。

我正在寻找示例 'client' 和 'server' 脚本,一旦我选择了可​​用的端口,它们将立即运行。

我发现的客户端代码似乎可以工作,如下所示。

但是我没有服务器可以使用它。

# 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>'

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

@adjam 你还没有创建 TcpServer, TCPSocket用于创建TCP/IP客户端套接字

要创建 TCP/IP 服务器,您必须使用 TCPServer

例如: 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;

tcp_server.rb

require "socket"

server = TCPServer.new(1234)

loop do  # Keep the server alive
  session = server.accept
  puts "Request arrived"
  session.write "Time is #{Time.now}" # Send data to client
  session.close
end

tcp_client.rb

require "socket"

socket = TCPSocket.open("localhost", 1234)
puts socket.gets # Print sever response
socket.close

现在 - 如果您想要 two-way 服务器和客户端之间的通信,请使用以下

tcp_client.rb

require "socket"

socket = TCPSocket.open("localhost", 1234)
socket.puts "Sample data to server" # Send data to server
puts socket.gets # Print sever response
socket.close

tcp_server.rb

require "socket"

server = TCPServer.new 1234

loop do
  session = server.accept
  puts "Data recieved - #{session.gets}" # Read data from client
  session.write "Time is #{Time.now}" # Send data to clent
  session.close
end