gpt4 book ai didi

python - 使用 Python 套接字连接不同网络上的 2 个设备

转载 作者:行者123 更新时间:2023-12-05 05:57:48 24 4
gpt4 key购买 nike

因此,如果有一个客户端和服务器具有各自的动态 IPv4 地址,并且都通过 2 个独立的路由器连接到 Internet,我如何让客户端和服务器使用它们的动态 IPv4 地址和Python 3 中路由器的静态 IPv4 地址。

我对一般的网络还很陌生,所以如果有另一种标准方法可以做到这一点,请在下面推荐一种更好的方法。

我目前有客户端和服务器端的代码。

客户:

import socket
import tqdm
import os

SEPARATOR = "<SEPARATOR>"
BUFFER_SIZE = 4096 # send 4096 bytes each time step

# the ip address or hostname of the server, the receiver
host = "192.168.1.21"
# the port, let's use 5001
port = 20
# the name of file we want to send, make sure it exists
filename = ""
# get the file size
filesize = os.path.getsize(filename)

# create the client socket
s = socket.socket()

print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected.")

# send the filename and filesize
s.send(f"{filename}{SEPARATOR}{filesize}".encode())

# start sending the file
progress = tqdm.tqdm(range(filesize), f"Sending {filename}", unit="B", unit_scale=True, unit_divisor=1024)
with open(filename, "rb") as f:
while True:
# read the bytes from the file
bytes_read = f.read(BUFFER_SIZE)
if not bytes_read:
# file transmitting is done
break
# we use sendall to assure transimission in
# busy networks
s.sendall(bytes_read)
# update the progress bar
progress.update(len(bytes_read))
# close the socket
s.close()

服务器:

import socket
import tqdm
import os
from pathlib import Path
# device's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5001
# receive 4096 bytes each time
BUFFER_SIZE = 4096
SEPARATOR = "<SEPARATOR>"

# create the server socket
# TCP socket
s = socket.socket()

# bind the socket to our local address
s.bind((SERVER_HOST, SERVER_PORT))

# enabling our server to accept connections
# 5 here is the number of unaccepted connections that
# the system will allow before refusing new connections
s.listen(5)
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")

# accept connection if there is any
client_socket, address = s.accept()
# if below code is executed, that means the sender is connected
print(f"[+] {address} is connected.")

# receive the file infos
# receive using client socket, not server socket
received = client_socket.recv(BUFFER_SIZE).decode()
filename, filesize = received.split(SEPARATOR)
# remove absolute path if there is
filename = os.path.basename(filename)
# convert to integer
filesize = int(filesize)

# start receiving the file from the socket
# and writing to the file stream
progress = tqdm.tqdm(range(filesize), f"Receiving {filename}", unit="B", unit_scale=True, unit_divisor=1024)
home = str(Path.home())
with open(f"{home}/Downloads/{filename}", "wb") as f:
while True:
# read 1024 bytes from the socket (receive)
bytes_read = client_socket.recv(BUFFER_SIZE)
if not bytes_read:
# nothing is received
# file transmitting is done
break
# write to the file the bytes we just received
f.write(bytes_read)
# update the progress bar
progress.update(len(bytes_read))

# close the client socket
client_socket.close()
# close the server socket
s.close()

注意:上面的客户端和服务端代码不是我写的。它是从另一个网站复制的,并经过轻微修改。

网站链接:https://www.thepythoncode.com/article/send-receive-files-using-sockets-python

最佳答案

当客户端处于不同网络时,它们将无法直接连接到服务器。

服务器端的路由器必须配置为启用从路由器的 WAN IP/端口到服务器的 LAN IP/端口的入站流量的端口转发。然后服务器可以监听其 LAN IP/端口上的连接,客户端可以连接到服务器路由器的 WAN IP/端口。

端口转发必须在路由器的配置中处理。通常,这是由管理员手动完成的。但是,如果路由器支持(并已启用)UPnP,则服务器可以使用 Internet Gateway Device protocol 从其自己的代码动态设置端口转发.一些平台提供 API 来为您实现该协议(protocol)(例如,Microsoft 的 NATUPNPLib 和 Windows 上的防火墙 API)。

关于python - 使用 Python 套接字连接不同网络上的 2 个设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68716972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com