为什么我的python套接字不能连接到另一台计算机?

问题描述:

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

这里是我的服务器:

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我不明白。

告诉我,如果有什么我需要清理。

+0

如果通过客户端从PC访问,主机上的端口5000似乎被防火墙阻止。 – MKesper

+0

那么我该怎么做呢? – Lojas

+0

Lojas,你可以使用'telnet'来检查服务器端口是否可以从客户端访问。 –

看起来端口由于某些防火墙而被阻塞。

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

在连接之前还使用socket.settimeout()以便连接在给定的时间内没有超时。秒。

+0

socket.settimeout()给了我以下错误:类型错误:的setTimeout()接受(给出0)只有一个参数,我添加它mySocket.connect_ex((主机,端口)) – Lojas

+0

权下,你必须提供没有。秒作为参数。对于ex - 'socket.settimeout(5)' –

+0

那么,我仍然没有连接到服务器,但是,错误更改为以下内容:文件“C:\ Users \ Lojas \ Desktop \ client.py” ,第15行,在主 mySocket.send(message.encode()) socket.timeout:超时,当我删除socket.settimeout()我得到这个:OSError:[WinError 10057]请求发送或接收数据被禁止,因为套接字未连接,并且(当使用sendto调用在数据报套接字上发送时)没有提供地址 – Lojas