【问题标题】:How to connect two random computers on global network using sockets in Python如何使用 Python 中的套接字连接全球网络上的两台随机计算机
【发布时间】:2021-07-21 02:02:58
【问题描述】:

我在两台计算机之间使用 python 中的套接字进行全局连接时遇到了一些问题。我成功地从笔记本电脑连接到在同一网络上工作的计算机。但现在我想和我的朋友联系。(我在控制台中有一个简单的聊天应用程序)

这是一个服务器初始化代码:

import socket
import threading

# print(socket.gethostname())

allmsgs = []

FORMAT = "utf-8"
HEADER = 64
PORT = 5050
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT)
DISCONNECTMESSAGE = "!DISCONNECT"

connections = []
clients = []

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind((ADDR))
#there are more code in this file, but I show only init 

这是一个客户端代码:

import socket
from time import sleep
import threading

SERVER = "(my public IP which popped up when i googled it)"
FORMAT = "utf-8"
HEADER = 64
PORT = 5050
DISCONNECTMESSAGE = "!DISCONNECT"
ADDR = (SERVER,PORT)


client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

nickname = input("Enter your nickname: ")

try:
    if nickname.split()[1] == "devmode":
        devmode = True
        nickname = nickname.split()[0]
except:devmode = False
while True:
    try:
        client.connect(ADDR)
        print("Succesfully connected")
        break
    except:
        print("Unable to connect.")
        print("Next try in 1 sec")
        sleep(1)

我有

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it" error on the client's side.

我不确定我是否可以成功连接。 我知道有很多关于这个主题的材料,包括堆栈本身,但我尝试过的没有一个对我没有帮助。

【问题讨论】:

  • 你的路由器上设置端口转发了吗?
  • 这是什么?我没有这样做。有必要吗?
  • 是的,它是;你可以google一下
  • 将服务器绑定到 INADDR_ANY,而不是您的本地主机名。

标签: python sockets tcp connection


【解决方案1】:

我假设这两台计算机不在同一个网络上,而是通过互联网进行通信。

如果是这种情况,那么您需要在路由器上设置端口转发。这因设备而异,因此无法在此处提供任何具体说明,但本质上,当您的路由器从家庭网络外部接收请求时,您需要将该请求转发到运行服务器应用程序的计算机上。您通常可以通过 192.168.1.0 或 192.168.0.254 访问您的路由器设置,但这又因设备而异。在端口转发部分下,您需要输入运行服务器应用程序的计算机的本地 IP 地址。

警告:从您的代码 sn-p 来看,您似乎没有从任何想要连接到您的客户端提供任何标识、身份验证或加密。您绝对希望在设置任何端口转发之前实现一些功能来限制谁和什么可以访问您的计算机上的服务,这不是一件容易的事,但也许是一个很好和有趣的学习经验。有许多不良机器人在网络上爬行寻找开放服务进行攻击,上面的代码将提供一个容易被利用的目标。

或者,我会考虑设置某种 VPN 服务,为您提供识别、身份验证和加密机制。 OpenVPN 是这个用例中相当常见的产品。

【讨论】:

    【解决方案2】:

    我认为您的客户端服务器 IP 应该与服务器端服务器 IP 相同 因为在服务器端代码中,您已经分配了本地 IP 地址,而在客户端,您已经分配了公共 IP。

    【讨论】:

    • 我理解你,但我不知道我应该在我的服务器代码中写什么作为 SERVER var。此变体不起作用:“0.0.0.0”、“localhost”、“127.0.0.1”和我当前的变体。(我想从世界上每台连接到互联网的计算机访问我的服务器。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多