如何使用 Python 中的套接字连接全球网络上的两台随机计算机
How to connect two random computers on global network using sockets in Python
我在使用 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.
我不确定我是否正确连接成功。
我知道有很多关于这个主题的资料,包括堆栈本身,但是我试过的 none 对我没有帮助。
我觉得你的客户端服务器IP应该和服务器端服务器IP一样
因为在服务器端代码中,您已经分配了本地 IP 地址,而在客户端中,您已经分配了 public IP。
我假设这两台计算机不在同一网络上并且正在通过 Internet 进行通信。
如果是这种情况,则您需要在路由器上设置端口转发。这因设备而异,因此无法在此处提供任何具体说明,但基本上当您的路由器收到来自家庭网络外部的请求时,您需要将该请求转发到您所在的计算机 运行 服务器应用程序。您通常可以通过 192.168.1.0 或 192.168.0.254 访问您的路由器设置,但这同样因设备而异。在端口转发部分下,您需要输入计算机的本地 IP 地址 运行 您的服务器应用程序。
警告:从您的代码片段来看,您似乎没有提供来自任何想要连接到您的客户端的任何标识、身份验证或加密。在 设置任何端口转发之前,您绝对想实施一些功能来限制谁和什么可以访问您计算机上的服务,这不是微不足道的,但也许是一个很好的有趣的学习体验。有许多不良机器人在网上爬行寻找开放服务进行攻击,上面的代码将提供一个容易利用的目标。
或者,我会考虑设置某种 VPN 服务,为您提供识别、身份验证和加密机制。 OpenVPN 是此用例的相当常见的产品。
我在使用 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.
我不确定我是否正确连接成功。 我知道有很多关于这个主题的资料,包括堆栈本身,但是我试过的 none 对我没有帮助。
我觉得你的客户端服务器IP应该和服务器端服务器IP一样 因为在服务器端代码中,您已经分配了本地 IP 地址,而在客户端中,您已经分配了 public IP。
我假设这两台计算机不在同一网络上并且正在通过 Internet 进行通信。
如果是这种情况,则您需要在路由器上设置端口转发。这因设备而异,因此无法在此处提供任何具体说明,但基本上当您的路由器收到来自家庭网络外部的请求时,您需要将该请求转发到您所在的计算机 运行 服务器应用程序。您通常可以通过 192.168.1.0 或 192.168.0.254 访问您的路由器设置,但这同样因设备而异。在端口转发部分下,您需要输入计算机的本地 IP 地址 运行 您的服务器应用程序。
警告:从您的代码片段来看,您似乎没有提供来自任何想要连接到您的客户端的任何标识、身份验证或加密。在 设置任何端口转发之前,您绝对想实施一些功能来限制谁和什么可以访问您计算机上的服务,这不是微不足道的,但也许是一个很好的有趣的学习体验。有许多不良机器人在网上爬行寻找开放服务进行攻击,上面的代码将提供一个容易利用的目标。
或者,我会考虑设置某种 VPN 服务,为您提供识别、身份验证和加密机制。 OpenVPN 是此用例的相当常见的产品。