Surplusss 2024-05-07 17:31 采纳率: 0%
浏览 15
已结题

(标签-Python|关键词-socket)

Python 的socket连接不上,在两个机房中可以用,但是在另一个机房就连不上

import socket
def jie(post):
    while True:
        try:
            s = socket.socket()
            Host = socket.gethostbyname(socket.gethostname())
            s.bind(('0.0.0.0', post))
            print(Host)
            s.listen(5)
            c, addr = s.accept()
            print(f'连接成功IP:{addr}')
            message=c.recv(1024).decode('utf-8')
            print(message)
            if message=='open':
                print('***open***')
                c.close()
                return 1
            else:
                c.close()
                return 0
        except:
            print('invalid')
def duan():
    s=socket.socket()
    s.bind(('localhost',0))
    asip,asport=s.getsockname()
    print(f'端口:{asport}')
    s.close()
    return asport
if __name__=='__main__':
    post=duan()
    while True:
        jie(post)

import socket
def fa():
    ip = input("Enter IP Address: ")
    port =int( input("Enter port"))
    while True:
        try:
            c = socket.socket()
            c.connect((ip, port))
            message = input("输入信息")
            c.send(message.encode('utf-8'))
        except socket.error as e:
            print(f'socket error{e}')
if __name__ == '__main__':
    fa()

是在学校机房中里搞的,两台电脑一台做服务器一台做客户端,ping 不通也看过防火墙的问题,关闭了还是一样,学校机房中有交换机连接电脑,两台电脑是ip是192.168.59.32和192.168.59.31

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-07 17:31
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    遇到跨机房网络连接问题时,可能涉及多个层面的因素,包括但不限于网络配置、防火墙规则、安全策略、DNS解析等。下面是一些排查和解决此类问题的步骤与建议:

    1. 确认基础网络连通性

    首先,确保两个机房之间的基本网络是连通的。可以通过ping命令测试从一个机房到另一个机房的主机是否可达。例如:

    ping 目标机房的IP地址
    

    如果ping不通,可能需要检查路由配置或联系网络管理员确认网络路径是否畅通。

    2. 检查防火墙与安全组设置

    确保目标机房的服务器没有防火墙规则阻止外部连接到你的服务端口。需要在服务器上查看并可能调整防火墙规则,例如使用iptables(Linux环境):

    sudo iptables -L -n
    

    如果发现有阻止规则,可以尝试添加允许规则,比如允许特定端口(替换PORT_NUMBER为你的端口):

    sudo iptables -A INPUT -p tcp --dport PORT_NUMBER -j ACCEPT
    

    同时,如果服务器位于云服务提供商上,还需要检查云服务的安全组设置,确保开放了相应的入站端口。

    3. 确认监听地址

    在你的服务端代码中,你使用了0.0.0.0作为绑定地址,这允许来自任意IP的连接,理论上是正确的。但是,如果目标机房有特殊的网络配置,可能需要绑定到特定的内网或外网IP。可以尝试明确指定服务器的公网IP或内网IP进行绑定,例如:

    s.bind(('服务器的实际IP地址', post))
    

    4. DNS解析问题

    虽然你的代码中直接使用了IP地址,但提到使用了socket.gethostbyname(socket.gethostname())获取本地主机名对应的IP地址。确保在所有机房中,这个操作返回的是可以被外部访问的正确IP地址。有时DNS解析问题可能导致连接失败。

    5. 端口转发与NAT配置

    如果服务器位于内网中,并且通过NAT设备访问外网,可能需要在NAT设备上配置端口转发,将外部请求转发到服务器的内部IP和端口。

    6. 代码调整建议

    在你的发送端代码中,直接使用了用户输入的IP地址,确保这个IP地址是目标服务器的真实可访问地址。此外,为了更好地处理异常,可以在接收端代码中增加一些日志输出,以便于定位问题,比如在异常捕获中打印具体的异常信息。

    示例代码调整

    接收端代码增加异常日志输出

    def jie(post):
        while True:
            try:
                s = socket.socket()
                Host = socket.gethostbyname(socket.gethostname())
                s.bind(('0.0.0.0', post))
                print(Host)
                s.listen(5)
                c, addr = s.accept()
                print(f'连接成功IP:{addr}')
                message = c.recv(1024).decode('utf-8')
                print(message)
                if message == 'open':
                    print('***open***')
                    c.close()
                    return 1
                else:
                    c.close()
                    return 0
            except Exception as e:
                print(f'连接失败: {e}')
    

    按照上述步骤逐一排查,应该能定位到问题所在。如果问题依然存在,可能需要更详细的网络拓扑信息和错误日志来进行深入分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 修改了问题 5月7日
  • 创建了问题 5月7日

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路