在Ruby(TCPServer)中创建的简单服务器,如何从另一个IP访问?

时间:2018-05-28 12:11:43

标签: ruby ssh server telnet

require 'socket'  # Provides TCPServer and TCPSocket classes

# Initialize a TCPServer object that will listen
# on localhost:2345 for incoming connections
server = TCPServer.new(2345)


loop do 
  # Wait until a client connects, then return a TCPSocket
  # that can be used in a similar fashion to other Ruby
  # I/O objects. (In fact, TCPSocket is a subclass of IO.)
  socket = server.accept

  socket.puts "What do you say?"

  they_said = socket.gets.chomp

  until they_said == "quit"
    socket.puts "You said: #{they_said}!"
    they_said = socket.gets.chomp
  end

  socket.puts "You said: #{they_said}. Goodbye!"

  # Close the socket, terminating the connection
  socket.close

  end

在上面的代码中,我在ruby中创建了一个简单的服务器(我刚刚介绍过的主题)。作为练习的一部分,我有以下指示:

"从笔记本电脑连接到您配对的笔记本电脑。你需要笔记本电脑的网络IP地址和服务器就可以了#34;

我们使用的是telnet,但看起来我们无法在Mac上使用它,因为High Siera不允许这样做(至少没有进一步的配置)。

任何人都可以建议我们如何做到这一点,或者指出有助于提供材料的方向?

1 个答案:

答案 0 :(得分:0)

如果你的操作系统不接受连接,那么在Ruby级别上你无能为力。您需要禁用防火墙或为此端口添加例外。

以下是您需要采取的三个步骤:

确保将TCPServer绑定到" public" IP

更新:正如@ siegy22在评论中指出:你也可以使用" 0.0.0.0"。

您可以在网络偏好设置或ipconfig

中找到它
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether ca:fe:ca:fe:ca:fe
    inet y.y.y.y netmask 0xffffff00 broadcast x.x.x.x
    media: autoselect
    status: active

此处y.y.y.y是您感兴趣的IP。如下所示创建TCTServer:

TCPServer.new("y.y.y.y", 2345)

停止Mac的防火墙(或允许与该端口的特定连接)

您可以在首选项/ Securiry部分中执行此操作。

在测试后重新启用它

从另一台计算机连接到服务器

telnet y.y.y.y 2345

以上步骤假设两台计算机在同一网络中,没有通过互联网连接。如果你在不同的网络上(例如连接到互联网的僵尸网络),我会想到两种解决方案

  1. 隧道:使用ngrok(https://ngrok.com/)等服务通过公共地址创建到服务器的隧道。按照说明操作,您将收到您的同伴可用于连接的公共地址。
  2. 您可以通过服务(类似https://www.whatismyip.com/what-is-my-public-ip-address/)查找您的公共IP,然后使用此IP进行连接。如果没有对网络进行进一步更改,这可能无法正常工作,因为您的路由器/调制解调器可能/应该阻止传入连接,并且您需要某种转发到您的计算机。
  3. 我建议你先尝试ngrok(或类似的东西)。