【问题标题】:Why doesn't my python socket connect to another computer?为什么我的 python 套接字不能连接到另一台计算机?
【发布时间】:2017-07-15 07:37:06
【问题描述】:

所以我最近开始测试套接字,并且我设法创建了一个服务器和客户端,当我在同一台电脑上运行它们时它们都可以协同工作。但是,当我将服务器放在另一台计算机上时,它给了我以下错误:“”TimeoutError:[WinError 10060]连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应""

这是我的服务器:

import socket
import pyautogui
import os

computerIP = socket.gethostbyname(socket.gethostname())

def Main():
    host = computerIP
    port = 5000
    value = 0
    mySocket = socket.socket()
    mySocket.bind((host,port))

    mySocket.listen(1)
    conn, addr = mySocket.accept()
    print ("Connection from: " + str(addr))
    while True:
            data = conn.recv(1024).decode()
            if not data:
                    break
            elif data == "shift":
                pyautogui.keyDown("shift")
            elif data == "relshift":
                pyautogui.keyUp("shift")
            elif data == "logout":
                os.popen("shutdown -l")
            elif data == "click":
                pyautogui.click()
                pyautogui.click()                                
            print ("from connected  user: " + str(data))
            data = str(data).upper()
            print ("sending: " + str(data))
            conn.send(data.encode())

    conn.close()

if __name__ == '__main__':
    Main()

我的客户:

import socket


def Main():
        host = #same ip as server
        port = 5000

        mySocket = socket.socket()
        mySocket.connect((host,port))

        message = input(" -> ")

        while message != 'q':
                mySocket.send(message.encode())
                data = mySocket.recv(1024).decode()

                print ('Received from server: ' + data)

                message = input(" -> ")

        mySocket.close()

if __name__ == '__main__':
    Main()

操作系统:Windows 8.1 Python 版本:3.4

我尝试在互联网上查找此内容,但由于我对 python 还很陌生,所以不太了解。

如果有什么我需要澄清的,请告诉我。

【问题讨论】:

  • 如果通过客户端从您的 PC 访问,主机上的端口 5000 似乎被防火墙阻止。
  • 那我该怎么办呢?
  • Lojas,您可以使用telnet 来检查服务器端口是否可以从客户端访问。
  • @VikasTiwari 但是当连接失败时我该怎么办?尝试不同的端口还是什么?
  • 如果连接失败,通常意味着端口被防火墙阻止,这就是连接超时的原因。防火墙可以是网络防火墙、应用程序防火墙或系统防火墙。在最简单的情况下,它可能只是一个 Windows 防火墙。尝试打开端口以允许对端口的传入访问。

标签: python python-3.x sockets server client


【解决方案1】:

该端口似乎由于某些防火墙而被阻止。

使用socket.connect_ex() 代替socket.connect()。如果连接成功则返回 0,否则 errno 变量的值将帮助您调试连接失败的原因。

在连接之前还要使用socket.settimeout(),以便在给定编号中连接超时。秒。

【讨论】:

  • socket.settimeout() 给我以下错误:TypeError: settimeout() 只接受一个参数(给定 0)我在 mySocket.connect_ex((host,port)) 下添加
  • 对,您必须提供编号。秒作为参数。对于前 - socket.settimeout(5)
  • 好吧,我仍然没有连接到服务器,但是,错误更改为以下内容:文件“C:\Users\Lojas\Desktop\client.py”,第 15 行,在 Main mySocket.send(message.encode()) socket.timeout: 超时,当我删除 socket.settimeout() 我得到这个: OSError: [WinError 10057] A request to send or receive data was not allowed because the socket未连接并且(使用 sendto 调用在数据报套接字上发送时)没有提供地址
  • 好的,所以请检查已安装的防病毒软件、Windows 防火墙或任何其他防火墙(在您运行套接字服务器的机器上),并确保它们都允许端口 5000。
  • 尝试谷歌搜索 - “如何在 windows 10 中打开端口”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2021-08-04
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多