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

2024-03-23

因此,如果有一个客户端和服务器具有各自的动态 IPv4 地址,并且两者都通过 2 个单独的路由器连接到互联网,那么如何让客户端和服务器使用其动态 IPv4 地址和路由器的静态 IPv4 相互连接Python 3 中的地址。

一般来说,我对网络非常陌生,因此如果有其他标准方法可以执行此操作,请在下面建议更好的方法。

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

Client:

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()

Server:

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 https://www.thepythoncode.com/article/send-receive-files-using-sockets-python


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

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

端口转发必须在路由器的配置中处理。通常,这是由管理员手动完成的。但是,如果路由器支持(并已启用)UPnP,服务器可以使用以下命令从其自己的代码动态设置端口转发:互联网网关设备协议 https://datatracker.ietf.org/doc/html/rfc6970。某些平台提供了为您实现该协议的 API(例如,Windows 上的 Microsoft NATUPNPLib 和防火墙 API)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 套接字连接不同网络上的 2 个设备 的相关文章

  • Python3+Kivy+Plyer 推送通知图标问题

    我在使用 Android 的简单通知测试应用程序时遇到了一个奇怪的错误 错误 python AttributeError type object notification org notificator R drawable has no
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么方法无法访问类变量?

    我试图理解Python中的变量作用域 除了我不明白为什么类变量不能从其方法访问的部分之外 大多数事情对我来说都很清楚 在下面的例子中mydef1 无法访问a 但如果a可以在全局范围 类定义之外 声明 class MyClass1 a 25
  • 无法将 datetime.datetime 与 datetime.date 进行比较

    我有以下代码并收到上述错误 由于我是 python 新手 我无法理解这里的语法以及如何修复错误 if not start or date lt start start date 有一个datetime date 从日期时间转换为日期的方法
  • 对打开文件的脚本进行单元测试

    我编写了一个脚本 它打开一个文件 读取内容并进行一些操作和计算 并将它们存储在集合和字典中 我该如何为这样的事情编写单元测试 我的问题具体是 我会测试文件是否打开 文件很大 这是unix字典文件 我如何对计算进行单元测试 我真的必须手动计算
  • 基于 True/False 值的 Python 优雅赋值

    我想根据三个布尔值中的值设置一个变量 最直接的方法是 if 语句后跟一系列 elif if a and b and c name first elif a and b and not c name second elif a and not
  • 使用 Python 抓取维基百科数据

    我正在尝试从以下内容中检索 3 列 NFL 球队 球员姓名 大学球队 维基百科页面 http en wikipedia org wiki 2008 NFL draft 我是 python 新手 一直在尝试使用 beautifulsoup 来
  • 如何将同步函数包装在异步协程中?

    我在用着aiohttp https github com aio libs aiohttp构建一个 API 服务器 将 TCP 请求发送到单独的服务器 发送 TCP 请求的模块是同步的 对于我来说是一个黑匣子 所以我的问题是这些请求阻塞了整
  • 将具有不同大小的行的数据加载到 Numpy 数组中

    假设我有一个包含如下数据的文本文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 如何将它加载到 numpy 数组中 使其看起来像这样 1 2 3 4 5 0 6 7 8 0 0 0 9 1
  • Matplotlib 将颜色图 tab20 更改为三种颜色

    Matplotlib 有一些新的且非常方便的颜色图 选项卡颜色图 https matplotlib org examples color colormaps reference html 我错过的是生成像 tab20b 或 tab20c 这
  • 与函数复合 UniqueConstraint

    一个快速的 SQLAlchemy 问题 我有一个 文档 类 其属性为 数字 和 日期 我需要确保没有重复的号码同年 是 有没有办法对 数字 年份 日期 进行UniqueConstraint 我应该使用唯一索引吗 我如何声明功能部分 SQLA
  • 将参数传递给 __enter__

    刚刚学习 with 语句尤其是这篇文章 http effbot org zone python with statement htm 问题是 我可以传递一个参数给 enter 我有这样的代码 class clippy runner def
  • PermanentTaskFailure:“模块”对象没有属性“迁移”

    我在 google appengine 上使用 Nick Johnson 的批量更新库 http blog notdot net 2010 03 Announcing a robust datastore bulk update utili
  • Python:如何从文件中的一行读取字符并将它们转换为浮点数和字符串,具体取决于它们是数字还是字母?

    我有一个如下所示的文件 1 1 C C 1 9873 2 347 3 88776 1 2 C Si 4 887 9 009 1 21 我想逐行读取文件的内容 当我使用的行上只有数字时 for line in readlines file d
  • Scikit Learn - K-Means - 肘部 - 标准

    今天我想学习一些关于 K means 的知识 我已经了解该算法并且知道它是如何工作的 现在我正在寻找正确的 k 我发现肘部准则作为检测正确的 k 的方法 但我不明白如何将它与 scikit learn 一起使用 在 scikit learn
  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • DRF:以编程方式从 TextChoices 字段获取默认选择

    我们的网站是 Vue 前端 DRF 后端 在一个serializer validate 方法 我需要以编程方式确定哪个选项TextChoices类已被指定为模型字段的默认值 TextChoices 类 缩写示例 class PaymentM
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 使用Python重命名目录中的多个文件

    我正在尝试使用以下 Python 脚本重命名目录中的多个文件 import os path Users myName Desktop directory files os listdir path i 1 for file in files

随机推荐

  • 在 HTTP 响应标头中使用内容处置

    我发现以下 asp net 代码在从数据库提供文件时非常有用 Response AppendHeader content disposition attachment filename fileName 这允许用户将文件保存到他们的计算机
  • Android 通过 ID 获取联系人组

    我有联系人 ID 如何获取联系人所属的组 我确信这与 Contacts Groups 类有关 但我无法弄清楚 In GroupMembership PERSON ID你有这个人的 ID 并且在同一张表中GroupMembership GRO
  • 如何在 .ascx 页面中使用 javascript

    如何在 ascx 页面中使用 javascript 您可以将脚本标签添加到标记中 Or use 脚本管理器 http msdn microsoft com en us library system web ui scriptmanager
  • 如何在链接期间替换pthread_create

    我想维护所有正在运行的线程的列表 以及有关每个线程的一些附加信息 在这个answer https stackoverflow com a 3476240 4676150提到可以提供我自己的 pthread create 版本并将程序与其链接
  • 将迷你图添加到表中

    我试图将所有数据处理转移到 Rmarkdown 而不是 SPSS Excel 但不知道如何创建带有附加图表的表格 在 Excel 中 这可以通过 Sparklines 功能来完成 或者像我一样 只需创建一个图表并非常准确地放置它 上表是使用
  • 如何使用 JS/nightwatchjs 并行运行多个测试?

    我可以通过 Nightwatch 并行执行多个测试用例吗 可能吗 我正在寻找 java 中线程能力的能力以并行测试用例执行 另外 你们对于从 Selenium 迁移到 Nightwatch 有何看法 您可以看到并行性的线程 守夜人 http
  • Spring 3 bean实例化顺序

    是否有指定 bean 实例化的顺序 即我希望特定的 bean 在其他 bean 之前实例化 就像启动顺序一样 我正在使用 Spring 3 2 和基于注释的声明方法 If bean A取决于豆子B通过定义
  • 在 R 的数据框中查找相似的行(不重复)

    我有一个超过 800k 行的数据集 示例 id fieldA fieldB codeA codeB 120 Similar one addrs example1 929292 0006 3490 Similar oh addrs examp
  • EF Core 在每次迁移时更新种子数据而不进行更改

    所以我看到我的数据库有这样的用户和角色 public static void SeedUsers this ModelBuilder modelBuilder var roles new new Role Id new Guid 51275
  • IQueryable C# 选择

    这是我的代码 但我需要仅选择要在我的 Datagridview 中显示的列 我需要代码来仅选择某些列 示例 Select t gt t usu Login t gt t usu Login public List
  • github http 克隆返回“您在服务器上运行 git update-server-info 了吗”

    我正在尝试在 Windows 上克隆一个 github 项目 我在防火墙后面 所以无法使用 ssh 跑步 git clone https github com user project git 正在返回https github com us
  • Pandas 数据框将唯一值转换为列名

    我有以下格式的 pandas 数据框 input df gw mac mac val status 0 AC233FC01403 AC233F264A4C 21 Outwards 1 AC233FC015F6 AC233F264A4C 37
  • AngularJs 路由链接中没有主题标签?

    我最近开始学习 AngularJs 进行 Web 开发 到目前为止我很喜欢它 但是 我不太确定在视图之间路由时是否在链接中包含主题标签 我主要关心的是 Google 如何缓存网站上的页面以及链接是否双向工作 即用户是否可以直接单击 www
  • 使用 google test 将类型名和字符串传递给参数化测试

    有没有一种方法可以使用谷歌的测试将类型和字符串传递给参数化测试 我想要做 template
  • mongoskin 只能在 mongodb 1.4 及更早版本上运行吗?

    我正在尝试了解nodejs express 和 mongodb 我正在运行 mongodb v 2 0 6 和最新的 Nodejs 和 Express 并尝试通过 mongoskin 将 Express 应用程序与 mongodb 连接 问
  • caffe全卷积cnn - 如何使用裁剪参数

    我正在尝试为我的问题训练一个完全卷积网络 我正在使用实施https github com shelhamer fcn berkeleyvision org https github com shelhamer fcn berkeleyvis
  • 重复并连接字符串 N 次

    在 Ruby 中 我可以使用以下命令重复字符串 n 次 E G my string 2 gt my stringmy string 在 R 中是否有同样简单的方法来做到这一点 您可以使用replicate or rep replicate
  • 是否有 Ruby 方法来确定同一类的两个实例的所有实例变量是否相等?

    是否有一种 Ruby 方法可以根据两个对象的所有实例变量是否相等来比较它们 该方法的行为类似于此代码 class Coordinates attr reader x y def initialize x y x x y y end end
  • 规范化/标准化 numpy 重新排列

    我想知道规范化 标准化 numpy 的最佳方法是什么recarray是 为了清楚起见 我不是在谈论数学矩阵 而是在谈论一个记录数组 其中还包含例如文本列 例如标签 a np genfromtxt iris csv delimiter dty
  • 使用 Python 套接字连接不同网络上的 2 个设备

    因此 如果有一个客户端和服务器具有各自的动态 IPv4 地址 并且两者都通过 2 个单独的路由器连接到互联网 那么如何让客户端和服务器使用其动态 IPv4 地址和路由器的静态 IPv4 相互连接Python 3 中的地址 一般来说 我对网络