我一直在网上寻找答案,但截至目前还未能找到答案。我对网络非常陌生,所以请接受我几乎一无所知。我能够使用套接字在LAN网络上的计算机之间发送数据,但我想知道是否可以连接到朋友家中的计算机,并且仅使用套接字从我们的计算机发送数据(无telnet)或netcat服务器)。或者这是不可能的,我应该看一个不同的python库,还是应该设置两种机器连接的服务器?
任何帮助都将不胜感激,请考虑到我是新手......
答案 0 :(得分:4)
套接字应该可以工作,但有一些警告:
如果您的网络看起来像这样:
+---------------+ +-----------+ +--------+ +---------------+ +------------------+
| Your computer |-->|Your router|-->|Internet|-->|Friend's router|-->|Friends's computer|
+---------------+ +-----------+ +--------+ +---------------+ +------------------+
192.168.0.5 host.isp.com friend.isp.com 192.168.2.55
您的朋友正在本地网络上运行服务器,例如在端口9000上,然后您将连接到friend.isp.com:9000。如果他们的路由器配置为将friend.isp.com接口(Internet)上端口9000上的流量重定向到192.168.2.55(本地计算机),则应正确建立连接。
答案 1 :(得分:4)
这是可能的,但需要在朋友的路由器上进行一些配置。原因是现在每个人都有一个由您的服务提供商提供的公共IP地址。此IP地址本身并不固定,但很容易查找当前的IP @ https://www.whatismyip.com/
现在发送不会成为问题,但接收是。比利时Telenet中的某些服务提供商不允许使用任何端口,您必须找出允许的端口。很可能不允许使用众所周知的端口。例如,如果没有事先联系您的ISP就无法托管网络服务器。例如,端口10000将工作。联系您的ISP以了解这些限制。
接下来的问题是你们两个都有一个路由器和一个私有网络,私有IP @支持启用NAT / PAT的路由器。例如,如果我在我的电脑上执行ipconfig,我会得到以下IP @ 192.168.1.99。这个IP @在我的路由器后面是独一无二的,但它在整个互联网上并不是唯一的,所以这些IP @在通过互联网进行通信时不能直接使用。因此,路由器将使用NAT / PAT和一些基于传出数据包填充的查找表。您发送了一些内容,nat / pat表已构建,您的私有IP @将被替换为公共IP和分配的端口。当收到回复时,端口用于将其更改回原始请求的IP @。出于这个原因,发送不是问题,但接收是。
要解决此问题,您的朋友必须设置端口转发或将电脑放入非军事区,这取决于相关路由器。端口转发就像用条目手动填充NAT / PAT表一样。如果有东西到达此端口,请使用该端口将其发送到该私有IP @。
发送和接收机器的下一个问题是防火墙。必须关闭防火墙或配置防火墙以允许您计划使用的端口上的传出和传入流量。
如果您了解所有这些,那么您可以使其发挥作用。但如果这对你来说都是Chineze,那么你将会遇到很多困难。
所以结论是有可能,但有一些需要解决的问题。
有很多人试图按照你在这里描述的那样做,并且在使它工作时遇到很多麻烦。如果你真的是一个新手,我会试着找一个有经验的人,或者你会失去你的头发。(通过挫折你自己拉出来)
您正在使用python或任何其他编程语言这一事实与本讨论无关。这纯粹是一个网络问题。
有关NAT / PAT的更多信息:http://www.webopedia.com/DidYouKnow/Computer_Science/NAT_and_PAT.asp
答案 2 :(得分:2)
主要(抽象)想法很简单。您在网络中有两个节点(计算机)(这次是互联网),因此您应该能够将它们连接在一起。
您可以在它们之间建立tcp连接。
套接字适用于您的情况,您只需要为每个套接字提供一个公共IP,并在每个节点中提供一个空闲端口。您可以从this range选择您的端口。
Python提供socket module,检查它,它非常简单容易。您也可以查看some examples。
然而实际上,您需要在防火墙中打开这些端口,并根据您的操作系统进行一些配置以允许这种通信。< / p>
答案 3 :(得分:1)
是的,这是可能的。
您只需要要连接的计算机的主机名或IP地址和端口号。只要可以建立到远程机器的路由,就可以建立连接。
查看socket
模块。这是一个简单的例子:
import socket
s = socket.socket()
s.connect(('123.123.123.123', 10000))
这将尝试与端口10000上的IP地址为123.123.123.123的远程计算机建立TCP连接。远程计算机需要打开端口10000,即侦听该端口上的连接的服务以及端口10000在任何防火墙设备中打开。
您也可以使用主机名代替IP地址:
s.connect(('remote.host.com', 10000))