gpt4 book ai didi

具有真实IP地址的python Socket服务器

转载 作者:太空狗 更新时间:2023-10-30 01:44:59 24 4
gpt4 key购买 nike

我正在使用我的 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' #Not my real ip address, its the one i got from whatismyip.org



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

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

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

仔细想想,真的没有办法。如果您进行出站连接,并且有人回复,则路由器知道回复应该发送到您的机器。但是如果有人突然出现并与路由器交谈,它怎么知道将连接发送到哪台机器?

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

如果您需要从外部进行连接,则需要做一些额外的工作才能做到。有四种方法可以解决这个问题:
  • 给你的机器一个真正的可公开寻址的 IP 地址(例如,把它放在路由器的 DMZ 上)。对于家庭用户来说,这通常甚至不是一个选择,对于不知道自己在做什么的人来说,这是一个糟糕的选择(除非您希望您的机器在午餐时间成为某人僵尸网络的一部分)。
  • 在您的路由器配置中设置静态端口转发。每个路由器都不同,但想法是您告诉它“如果有人来寻找端口 9001,请始终将它们发送到机器 192.168.1.64”。
  • 使用 UPnP 动态设置端口转发。
  • 设置 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,并连接到路由器的公共(public) IP,并且您声称已在路由器上设置了端口转发,但您仍然收到完全相同的错误。

    如果这一切都是正确的,那么可能会出现三个明显的问题:
  • 你实际上不是端口转发;设置有问题。
  • 你实际上并不是在听 0.0.0.0:9001。
  • 您有防火墙阻止连接。

  • 您可以进行一些测试来缩小范围。
  • 打开两个终端。一、输入nc -kl 9001 .在另一个中,输入 nc 12.34.56.78 9001 .它们应该连接起来,因此您在一个窗口中输入的任何内容都会出现在另一个窗口中(可能只有在您点击 Return 之后)。如果这有效,则端口转发正在工作,并且没有防火墙问题,因此这是您的代码中的问题。
  • 如果这不起作用,请准确发布您在每个窗口中看到的内容。然后 Ctrl-C 第二个 nc ,然后输入 nc 192.168.1.64 9001 .如果现在可行,要么端口转发设置不正确,除非您有一个聪明的防火墙,允许相同主机(或相同接口(interface))连接但不允许远程连接。
  • 如果两者都不起作用,则可能是防火墙问题。 (除非您对 IP 地址或其他内容有误。)您可能会在某处找到日志,但是如果不知道您在哪个平台上以及您使用的是什么防火墙,就很难提供太多帮助。 (此外,对于与 SO 不同的站点,这可能是一个问题。)

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

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

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

    关于具有真实IP地址的python Socket服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12631791/

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