我最近在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.
答案 0 :(得分:1)
您的服务器仅绑定到本地主机,因此阻止来自其他主机的连接。
尝试:
s.bind(("0.0.0.0",port))
答案 1 :(得分:0)
我遇到了这个问题,花了我好几个小时才能弄清这个问题,我发现(就像许多其他人说的那样,@ Cld)是您的防火墙阻止了连接。我如何解决这个问题:
尝试在要连接的计算机上运行服务器。 (例如,如果要在计算机A上运行服务器并从计算机B连接,请在计算机B上运行服务器。)
如果您使用的是Windows(我不确定是Mac还是Linux),它将随防火墙弹出窗口一起弹出,这将允许您授予程序访问专用网络的权限。
只需勾选以下框: “私人网络,例如我的家庭或工作网络” 然后按允许访问
就是这样!您已解决了该特定问题。现在,可以在该计算机上测试服务器或关闭服务器,然后回到您的主机,该主机将托管该服务器并运行它。您应该看到它现在正在工作。
我希望这对您有所帮助,因为这是我的第一篇文章!
编辑:我也做了@Daniel在他的帖子中所做的工作,只是将s.bind更改为包括'0.0.0.0'。
答案 2 :(得分:0)
我有一段时间遇到了同样的问题,使用 ngrok 创建 tcp 隧道对我有用。你可以看看here
对于PC上的简单套接字应用程序,只需通过ngrok tcp <port_number>
公开您正在使用的端口,将服务器套接字绑定到本地主机和公开的端口,并在客户端使用带有端口号的隧道的url (通常看起来像 0.tcp.us.ngrok.io
和端口号)。
您甚至可以通过指定 --region
标志在免费帐户上创建多个隧道(在我的情况下需要):https://ngrok.com/docs#global-locations