繁体   English   中英

无法连接不同计算机上的 Python 套接字

[英]Unable To Connect Python Sockets On Different Computers

我最近用 Python 编写了一个小型聊天程序的代码。 当我从同一系统上的不同终端连接它们时,套接字连接正常。 但是当我从通过同一 Wifi 网络连接的不同计算机连接它们时,似乎不会发生同样的情况。

这是服务器代码:

#!/usr/bin/env python

print "-"*60
print "WELCOME TO DYNASOCKET"
print "-"*60

import socket, os, sys, select

host = "192.168.1.101"
port = 8888
connlist = []

try:
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print "Socket Successfully Created."
    connlist.append(s)
    s.bind((host,port))
    print "Socket Successfully Binded."
    s.listen(10)
    print "Socket is Now Listening."
except Exception, e:
    print "Error : " + str(e)
    sys.exit()

def air(sock,message):
    for socket in connlist:
        if socket != sock and socket != s:
            try:
                socket.sendall(message)
            except:
                connlist.remove(socket)

while 1:
    read_sockets,write_sockets,error_sockets = select.select(connlist,[],[])
    for sock in read_sockets:
        if sock == s:
            conn, addr = s.accept()
            connlist.append(conn)
            print "Connected With " + addr[0] + " : " + str(addr[1])
        else:
            try:
                key = conn.recv(1024)
                print "<" + str(addr[1]) + ">" + key
                data = raw_input("Server : ")
                conn.sendall(data + "\n")
                air(sock, "<" + str(sock.getpeername()) + ">" + key)

            except:
                connlist.remove(sock)
                print "Connection Lost With : " + str(addr[1])
conn.close()
s.close()

这是客户端脚本:

#!/usr/bin/env python

print "-"*60
print "WELCOME TO DYNASOCKET"
print "-"*60

import socket, os, sys

host = "192.168.1.101"
port = 8888

try:
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print "Socket Successfully Created."
    s.connect((host,port))
    print "Connected With " + host + " : " + str(port)
except socket.error, e:
    print "Error : " + str(e)

while 1:
    reply = raw_input("Client : ")
    s.send(reply)
    message = s.recv(1024)
    print "Server : " + message

s.close()

当我尝试从另一台计算机连接客户端时,出现此错误:

 Error : [Errno 10060] A Connection attempt failed because the connected party
 did not respond after a period of time, or established connection failed
 because connected host has failed to respnd.

您仅将服务器绑定到本地主机,以便阻止来自其他主机的连接。

尝试:

s.bind(("0.0.0.0",port))

我遇到了这个问题,我花了好几个小时才弄清楚这一点,我发现(就像许多其他人所说的@Cld)是您的防火墙阻止了连接。 我是如何解决这个问题的:

  1. 尝试在您尝试连接的机器上运行服务器。 (例如,如果要在机器 A 上运行服务器并从机器 B 连接,请在机器 B 上运行服务器)。

  2. 如果您使用的是 Windows(我不确定 Mac 或 Linux),它将弹出防火墙弹出窗口,这将允许您授予程序访问您的专用网络的权限。

  3. 只需勾选显示以下内容的框:“私人网络,例如我的家庭或工作网络”,然后按允许访问

  4. 就是这样! 你已经解决了那个特定的问题。 现在可以随意在该机器上测试服务器或关闭服务器并返回到您的主机,该主机将托管该服务器并运行它。 您应该看到它现在正在工作。

我希望这对您有所帮助,因为这是我的第一篇文章!

编辑:我也做了@Daniel 在他的帖子中所做的,将 s.bind 更改为包含“0.0.0.0”。

我有一段时间遇到了同样的问题,使用 ngrok 创建 tcp 隧道对我有用。 你可以在这里查看

对于您电脑上的简单套接字应用程序,只需通过ngrok tcp <port_number>公开您正在使用的端口,将服务器套接字绑定到本地主机和公开的端口,并使用隧道的 url 和客户端的端口号(通常看起来如0.tcp.us.ngrok.io和端口号)。

您甚至可以通过指定--region标志在免费帐户上创建多个隧道(在我的情况下需要): https : --region

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM