【问题标题】:Can't port forward for a simple Python server无法为简单的 Python 服务器进行端口转发
【发布时间】:2017-07-01 16:20:39
【问题描述】:

我开始编写一个简单的服务器和客户端脚本。我在本地网络上测试了脚本,它运行良好:服务器将打开,并等待客户端连接。一旦客户端连接,它就会让我继续。

然后我决定通过互联网对其进行测试,这就是问题开始发生的原因。我在 Ubuntu 上运行服务器,在 Windows 机器上运行客户端。

服务器连接代码:

import socket
import sys

#Create a socket for connection
def socket_create():
    try:
        global host
        global port
        global s
        host = ''
        port = 5698
        s = socket.socket()
        print("Socket created.")
    except socket.error as msg:
        print("Socket creation error: " + str(msg))

#Bind the created socket to a port, sleep for conn
def socket_bind():
    try:
        global host
        global port
        global s
        s.bind((host, port))
        print("Waiting for connection")
        s.listen(5)
    except socket.error as msg:
        print("SOcket binding error: " + str(msg) + "\n Retrying...")
        socket_bind()

#Estabilish Connection with client
def socket_accept():
    conn, adress = s.accept()
    print("Connection has been estabilished | " + "IP " + adress[0] + " | Port " + str(adress[1]))
    send_command(conn)
    conn.close()

客户端连接代码:

import os
import socket
import subprocess


# Create a socket
def socket_create():
    try:
        global host
        global port
        global s
        host = 'My Internet IP'
        port = 5987
        s = socket.socket()
    except socket.error as msg:
        print("Socket creation error: " + str(msg))


# Connect to a remote socket
def socket_connect():
    try:
        global host
        global port
        global s
        s.connect((host, port))
    except socket.error as msg:
        print("Socket connection error: " + str(msg))

还有错误:

[Errno 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应

我永远不会从服务器获得“连接已建立”的打印信息,而且我会收到该错误。

任何人都可以看到任何可能导致代码出现问题的内容吗?

端口转发路由器后,我是否需要在 Ubuntu 本身上进行任何其他配置?我应该打开的端口是TCP,对吧?

在路由器上打开端口后,如果我使用“http://www.canyouseeme.org/”之类的服务,它会立即显示端口已打开,还是仅在我正在运行服务器并等待连接?

【问题讨论】:

  • 您应该用您找到的解决方案来回答您自己的问题。其他人可能会遇到同样的问题。
  • @Malt 我用修复的小描述更新了这个问题。一旦我有时间,我会用一个关于如何使用端口映射器的小教程来正确地回答这个问题。

标签: python-3.x sockets network-programming


【解决方案1】:

我设法解决了这个问题。这是我如何做到的深入指南。

问题:即使在路由器配置上打开端口后,您仍然看不到正在运行的服务上打开的端口。

解决方案:端口映射器。

注意事项:我必须在 Ubuntu 上运行 Port Mapper,因为在 Windows 上运行它似乎不适合我。此外,如果您让您的计算机休眠或关机,当您再次打开它时,您将不得不重新打开端口(但不用担心,因为它只需点击一个按钮)。

你需要什么:https://sourceforge.net/projects/upnp-portmapper/

  • 首先,只需在终端中运行“java”以确保您已安装 Java,或者为了安装它(屏幕上会显示说明)。

  • 从给定的链接下载 Portmapper.jar。

  • 下载后,只需在终端运行“java -jar Portmapper.jar”即可打开图形界面。

  • 打开gui后,按Connect,就可以自动连接路由器了。

  • 所有当前打开的端口现在都将显示在屏幕上。我们知道要查找端口映射预设。

  • 在端口映射预设中,继续并按创建。

  • 在这里,为预设命名。然后,如果您想要特定 IP 的连接,请填写远程主机,或者为任何 IP 留空。内部客户端将是您服务器的网络 IP(在我的情况下,因为我在与端口映射器相同的机器上运行服务器,所以我将勾选使用本地主机。

  • 现在我们将继续添加一个新端口作为 TCP 连接。在这里,我们可以让外部和内部端口具有相同或不同的值。请记住,内部端口(您机器的端口)将是您将在服务器上使用的端口,而外部端口(您的路由器开放端口)将是您将在客户端或连接到您的任何设备上使用的端口服务器。

  • 在此之后,只需保存预设,选择它并按使用。如果您知道单击端口列表下的更新,您将看到新的开放端口。只是为了确保,您可以让您的服务器运行等待连接,只需转到“http://www.canyouseeme.org/”,输入端口,然后就可以了。

  • 请记住,在关闭计算机或让计算机进入睡眠状态后,您必须返回 PortMapper,然后再次在您想要的预设上单击使用(取决于您想要的端口)。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2021-12-09
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2014-03-21
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多