用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', <port>)
,对吧?
是的,0.0.0.0 也应该可以工作。谢谢,我会把它添加到我的答案中:-)
是否相同网络,TCPServer.new(2345)
仅绑定到localhost
。即使在同一 LAN 上,您也无法从另一台机器连接到该机器。这个问题更多的是关于网络而不是红宝石。以上是关于用Ruby(TCPServer)创建的简单服务器,如何从另一个IP访问?的主要内容,如果未能解决你的问题,请参考以下文章
Ruby 中的 TCPServer.new(port) 和 TCPServer.open("X.X.X.X", port) 有啥区别?