python Socket服务器与真实IP地址

2023-11-27

我正在使用我的 python 服务器,但我已经不再使用 localhost,我想通过互联网进行访问。到目前为止我的代码是:

import socket
import threading
import socketserver

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = self.request.recv(1024)
        cur_thread = threading.current_thread()
        response = "{}: {}".format(cur_thread.name, data)
        self.request.sendall(b'worked') 

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

def client(ip, port, message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    try:
        sock.sendall(message)
        response = sock.recv(1024)
        print("Received: {}".format(response))
    finally:
        sock.close()

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "0.0.0.0", 9001

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    ip, port = server.server_address

    # Start a thread with the server -- that thread will then start one
    # more thread for each request
    server_thread = threading.Thread(target=server.serve_forever)
    # Exit the server thread when the main thread terminates
    server_thread.daemon = True
    server_thread.start()
    print("Server loop running in thread:", server_thread.name)
    ip = '12.34.56.789' #Not my real ip address This is just to hide my ip
    print(ip, PORT)

    client(ip, PORT, b'Hello World 1')
    #client(ip, port, b'Hello World 2')
    #client(ip, port, b'Hello World 3')

    server.shutdown()

当我运行这个时,我收到错误:

Server loop running in thread: Thread-1
12.34.56.789 9001
Traceback (most recent call last):
  File "C:/Python32/serverTesty.py", line 43, in <module>
    client(ip, PORT, b'Hello World 1')
  File "C:/Python32/serverTesty.py", line 18, in client
    sock.connect((ip, port))
socket.error: [Errno 10061] No connection could be made because the target machine actively refused it

我知道该端口有效,因为当我在端口 9001 上使用 canyouseeme.org 时,当我的程序运行时,它会显示其处于活动状态并正在运行。所以我想我只是在某个地方连接错误。


ip = '12.34.56.789' #不是我真实的IP地址,它是我从whatismyip.org获得的

第一个问题是“12.34.56.789”根本不是有效的 IP 地址。每个组件必须适合 8 位 (0-255); 789 不可能。但我假设这不是您正在运行的实际代码,因为输出显示 12.45.29.122。

第二个问题是您使用的地址不是您的真实地址。

您的机器可能有一个内部 IP 地址,只能从您的 LAN 访问。那么,你的router有一个外部IP地址。路由器使用一种称为网络地址转换的技术,让 LAN 上的每台计算机在充当客户端时假装外部地址属于它们(这就是为什么 Whatismyip.org 向您显示该地址)。但当它们充当服务器时,这就不起作用了。

仔细想想,确实没有办法。如果您建立出站连接,并且有人回复,路由器知道回复应该发送到您的计算机。但是,如果有人突然出现并与路由器对话,它怎么知道将连接发送到哪台机器呢?

如果您尝试从同一 LAN 内部进行连接,有一个非常简单的解决方案:使用服务器的真实内部地址,而不是路由器的外部地址。

如果您需要从外部进行连接,则无需做一些额外的工作。有四种方法可以解决这个问题:

  1. 为您的机器提供一个真实的可公开寻址的 IP 地址(例如,将其放在路由器的 DMZ 上)。对于家庭用户来说,这通常不是一个选择,对于那些不知道自己在做什么的人来说,这是一个糟糕的选择(除非你希望你的机器在午餐时间成为某人僵尸网络的一部分)。

  2. 在路由器配置中设置静态端口转发。这对于每个路由器来说都是不同的,但想法是你告诉它“如果有人来寻找端口 9001,总是将他们发送到机器 192.168.1.64”。

  3. 使用 UPnP 动态设置端口转发。

  4. 设置 NAT 打洞。

选项3和4更复杂,我认为选项2就是你想要的,所以我不会解释它们。

最重要的是:

HOST, PORT = "192.168.1.64", 9001

server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)

您已明确告诉服务器“监听 192.168.1.64”。即使您将服务器计算机放在 DMZ 上,因此它的地址为 192.168.1.64 和 12.45.29.122,您的程序也仅侦听第一个地址上的连接,因此没有人能够使用第二个地址访问它。如果您想监听所有地址,请使用 0.0.0.0。

在编辑后的版本中,您现在正在侦听 0.0.0.0,并连接到路由器的公共 IP,并且您声称已在路由器上设置了端口转发,但您仍然收到完全相同的错误。

如果这一切都是正确的,那么存在三个明显的问题可能会出现问题:

  1. 你实际上并不是端口转发;而是端口转发。设置有问题。
  2. 您实际上并没有在 0.0.0.0:9001 上收听。
  3. 您的防火墙阻止了连接。

您可以进行一些测试来缩小范围。

  1. 打开两个终端。在其中之一中,输入nc -kl 9001。在另一个中,输入nc 12.34.56.78 9001。它们应该连接起来,因此您在一个窗口中输入的任何内容都会出现在另一个窗口中(可能仅在您按回车键后)。如果有效,则端口转发正常工作,并且不存在防火墙问题,因此这是您的代码中的问题。

  2. 如果这不起作用,请准确发布您在每个窗口中看到的内容。然后按 Ctrl-C 第二个nc,然后输入nc 192.168.1.64 9001。如果现在有效,则端口转发设置不正确,除非您有一个聪明的防火墙,允许同一主机(或同一接口)连接但不允许远程连接。

  3. 如果两者都不起作用,则可能是防火墙问题。 (除非您的 IP 地址或其他信息有误。)您可能可以在某个地方找到日志,但如果不知道您所在的平台以及您使用的防火墙,就很难提供太多帮助。 (另外,这可能是与 SO 不同的网站的问题。)

如果您使用的是 Windows 或某些 Linux 发行版,则需要获取以下副本nc(netcat) 来自某处;在大多数 Linux 发行版和 Mac 上,它应该是内置的。此外,GNU、BSD 和 Hobbitnc略有不同,所以如果nc -kl 6000给你一个错误,你可能需要阅读手册页或--help。 (如果我没记错的话,霍比特人nc需要-l -p6000, BSD 要求-l 6000,GNU 允许其中之一。)

或者你可能想要ncat,netcat 的重新实现,我知道它可以处理我上面使用的语法,并且有一个适用于 Windows 的单文件静态可执行文件。

如果您无法开始nc,至少尝试更改代码以连接到 192.168.1.64 而不是 12.34.56.78。如果这解决了问题,至少您会知道它是端口转发或允许同一主机/接口连接但不允许远程连接的防火墙。

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

python Socket服务器与真实IP地址 的相关文章

  • 如何编写嵌套的 __init__.py 文件

    我正在努力解决嵌套问题 init py在我正在编写的Python包中 该包具有以下架构 module init py submodule1 init py source py submodule2 init py source py sub
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • AttributeError:“模块”对象没有属性[重复]

    这个问题在这里已经有答案了 我有两个 python 模块 a py import b def hello print hello print a py print hello print b hi b py import a def hi
  • python 中的 <> 运算符有什么作用?

    我刚刚遇到这个here http www feedparser org feedparser py 总是这样使用 if string1 find string2 lt gt 1 pass 什么是 lt gt 运算符这样做 为什么不使用通常的
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • 使用 Python 将连续日期分组在一起

    Given dates datetime 2014 10 11 datetime 2014 10 1 datetime 2014 10 2 datetime 2014 10 3 datetime 2014 10 5 datetime 201
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • Kotlin 协程中的 launch/join 和 async/await 有什么区别

    In the kotlinx coroutines库 您可以使用以下任一方式启动新的协程launch with join or async with await 它们之间有什么区别 launch习惯于即发即忘协程 这就像开始一个新线程 如果
  • imap_unordered,但带有惰性扁平生成器

    我有一个已经可以解决的问题multiprocessing Pool但解决方案并不是非常理想 也就是说 我拥有一组相当小的输入 每个输入都映射到一个大数据集 虽然我可以使用imap unordered对于返回列表的函数 这远非高效 因为每个大
  • PHP 生成的 csv 文件在 Excel 2007 中显示英镑符号 (£) 的 £

    我使用以下标头命令生成 csv 文件 header Content type text csv charset utf 8 encoding utf 8 header Content Disposition attachment filen
  • 32 位系统上的 Java 10(及更高版本)

    据我所知 oracle 没有计划为 32 位提供 java 但也许我误解了情况 如果我是对的 如果我们需要支持 32 位库 dll 我们该怎么办 那么 32 位操作系统又如何呢 目前这似乎对未来产生巨大影响 但正如我所说 也许我错了 事实上
  • 在 PyQt 中(很好地)显示代数表达式 [重复]

    这个问题在这里已经有答案了 在我的 python 程序中 有一个我创建的数学对象的层次结构 它们代表数学公式 例如 有Collection 这是一系列Equations 这是一个包含两个的容器Sums Products Quotients
  • 设置autoDeploy和deployOnStartup会导致应用程序在启动时部署两次?

    我正在阅读 Damonar Chetty 撰写的 Tomcat 6 开发人员指南 他在主机章节中说道 将两者设置为 true 将导致应用程序在启动时部署 然后在 Tomcat 启动并运行后再次部署 因此 请确保至少将其中一项设置为 fals
  • 在 foreach 循环内部或外部声明变量:哪个更快/更好?

    其中哪一个更快 更好 这个 List
  • 在 Java 中使用 BouncyCastle 通过 ECIES 进行加密

    我正在尝试使用 Java 中的 BouncyCastle 使用 ECC 算法加密一些内容 但我收到 BouncyCastle 库的异常 说无法投射JCEECPublicKey to IESKey 据我了解 生成的公钥KeyPairGener
  • mvc4 项目中的 Intellisense 无法在 vs 2012 professional 中工作?

    在我的剃刀视图中 智能感知不起作用 有解决这个问题的方法吗 我正在使用新发布的 VS 2012 Professional 并构建一个 ASP NET MVC 4 项目 我的剃刀视图中的智能感知不起作用 有什么解决办法吗 对我有帮助的是删除
  • Android - 如何动态更改片段布局

    我有一个平板电脑应用程序 其中包含一个显示我公司数据的 about 片段 我想在页面上时根据屏幕方向动态更改布局 但我还没有找到方法 如果有人找到解决方案 请提前致谢 Yume177 我找到了怎么做 Override public void
  • Git 子模块在 TFS Build 上失败

    当我尝试使用 TFS 和 Git 进行构建时 存在一个限制 即 TFS 的 git 提供程序尚不支持子模块 有点痛苦 但到底是什么 我可以告诉 TFS 在编译之前运行批处理文件 我用它来调用手动 git 脚本来更新我的 超级 项目中的所有子
  • 从 GitHub 操作推送到源

    我正在努力推动origin远程 GitHub 操作 我的行动逻辑是 handle pull request review事件并按评论消息过滤 签出到 master 合并 PR 分支 运行一些检查并将其推送到origin 脚本是 if GIT
  • Phoenix 框架中的动态模型

    有没有办法在Phoenix中动态创建和使用模型 我有一个存储有关客户表的元数据的应用程序 它们设置了一些字段 列名称和类型 然后向我发送 CSV 文件以进行解析和存储 我想根据存储的元数据生成一个模型 以便我可以使用 Ecto 来管理客户端
  • PyUSB 后端无法访问

    嘿 我正在尝试运行教程中提供的简单脚本 USB 正在导入 但是当我尝试搜索设备时出现以下错误 请帮助 gt gt gt dev usb core find Traceback most recent call last File
  • Java套接字的PrintWriter线程安全吗?

    所以 我有两个线程 线程一管理客户端连接 只有一台客户端和一台服务器 我将其称为我的服务器线程 线程二管理向客户端发送消息 我将其称为我的消息处理器线程 线程一负责定期向客户端发送心跳 在编程时 我假设套接字不是线程安全的 但缓冲区是 只要
  • 梯度方向计算

    我正在计算机视觉课程中完成我的任务 子任务之一是基于图像亮度的梯度方向计算 我制作了一个明亮 宽度 高度 矩阵 其中包含图像每个像素的亮度值 我有两个这样的功能 double Image grad x int x int y if x wi
  • 在 C# 中使用动态创建的控件

    我正在创建一个应用程序 用户将在其中输入成绩 程序将输出加权平均值 加载时 它将询问作业的类别数量 然后程序将动态创建文本框供用户输入信息 问题是我无法弄清楚如何读取创建文本框后输入的文本 这是我的代码 TextBox txtbx new
  • 泛型类型推断失败?

    实施例A 研究以下片段 public class ExampleA static class Pair
  • android gridview中的分页[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 android gridview 可以分页吗 如果可用 您可以提供任何链接吗 对于水平分页 请在 ViewPager 中使用 GridView 这是一个教程
  • python Socket服务器与真实IP地址

    我正在使用我的 python 服务器 但我已经不再使用 localhost 我想通过互联网进行访问 到目前为止我的代码是 import socket import threading import socketserver class Th