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

Posted

技术标签:

【中文标题】用Ruby(TCPServer)创建的简单服务器,如何从另一个IP访问?【英文标题】:Simple server created in Ruby (TCPServer), how to access from another IP? 【发布时间】:2018-11-07 00:51:30 【问题描述】:
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 地址”

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

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

【问题讨论】:

【参考方案1】:

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

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

确保将 TCPServer 绑定到“公共”IP

更新:正如@siegy22 在 cmets 中指出的那样:您也可以使用“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 的防火墙(或允许特定连接到该端口)

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

测试后重新启用它

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

telnet y.y.y.y 2345

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

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

我建议你先试试 ngrok(或类似的东西)。

【讨论】:

非常感谢!我想我刚刚意识到的是我们目前不在同一个网络上。通常我们会(你会在同一个教室环境中),但今天是英国银行假日(国庆日),因此我们在家工作。出于兴趣 - 有没有办法连接到不在同一个网络中的人? 你也可以使用TCPServer.new('0.0.0.0', &lt;port&gt;),对吧? 是的,0.0.0.0 也应该可以工作。谢谢,我会把它添加到我的答案中:-) 是否相同网络,TCPServer.new(2345) 仅绑定到localhost。即使在同一 LAN 上,您也无法从另一台机器连接到该机器。这个问题更多的是关于网络而不是红宝石。

以上是关于用Ruby(TCPServer)创建的简单服务器,如何从另一个IP访问?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的 TCPServer.new(port) 和 TCPServer.open("X.X.X.X", port) 有啥区别?

如何使用 Ruby 找到免费的 TCP 服务器端口?

Qt:设计QtcpSocket连接多个TcpServer?

高性能TcpServer - 5.客户端管理

高性能TcpServer - 3.命令通道(处理:掉包,粘包,垃圾包)

Delphi中的TcpServer和TcpClient以及UdpSocket的问题