无法在请求的地址创建套接字

问题描述 投票:0回答:0

我的任务: 我正在尝试用 Python 构建一个简单的客户端-服务器消息传递系统。我想在一台机器上初始化一个服务器(只是 Python 套接字服务器代码绑定(),侦听()和连接()到客户端),并在另一台机器上启动客户端并让服务器和客户端能够发送/互相接收消息。

我的本地设置: 在我的本地机器上,我可以在 IP 地址 127.0.0.1 和端口 55555 上启动服务器代码,然后让客户端连接到它。我为服务器打开一个终端,为客户端打开一个终端。然后他们就可以在彼此之间发送和接收消息。服务器通过要求用户输入运行服务器机器(以及客户端将连接到的)的 IP 地址和端口号来初始化。这里只是服务器类代码的初始化部分:

import socket
import threading

class Server:
    def __init__(self, ip_addr, port, node_id):

        self.my_port = port             # an int representing the port number
        self.my_ip_addr = ip_addr       # a string representing the IP address

        #initialize socket
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        
        #initialize base server to my port and my IP address
        self.server.bind((self.my_ip_addr, self.my_port))
        
        #listen for connection from clients
        self.server.listen()
                
        #other code for accepting connection from client which I will leave out
        ...

问题: 虽然这在本地完全符合预期,但当我尝试在外部机器上复制它时,它不起作用。我创建了一个 AWS EC2 实例并尝试在 AWS 提供的公共 IPv4 地址上启动服务器。假设它是 12.345.678.90,我选择的端口是 55555。

我收到这个错误:

self.server.bind((self.my_ip_addr, self.my_port))
OSError: [Errno 99] Cannot assign requested address

我尝试过的: 设置 EC2 实例时,我禁用了防火墙并允许所有 HTTP 和 HTTPS 流量。我在 EC2 上尝试了很多不同的端口号,公共 IP 地址,私有 IP 地址,甚至 127.0.0.1。它们都产生相同的结果。我也尝试过 socket.error:[errno 99] cannot assign requested address and namespace in python 的解决方案,但是当套接字确实绑定到服务器时,它不允许客户端连接到服务器(连接只是超时,永远不会连接)。

我不确定需要什么来初始化我的 EC2 实例上的服务器以绑定套接字,然后开始接受来自客户端的请求,我最终希望来自另一个 EC2 实例。

python sockets amazon-ec2 ip
© www.soinside.com 2019 - 2024. All rights reserved.