Windows 7 上的套接字,无法连接
Posted
技术标签:
【中文标题】Windows 7 上的套接字,无法连接【英文标题】:Sockets on Windows 7, can't connect 【发布时间】:2013-06-20 06:39:50 【问题描述】:尝试创建我的第一个客户端-服务器应用程序时,我遇到了一个错误。此代码与文档中的代码完全相同,但我有问题。
服务器:
import socket
HOST = 'localhost'
PORT = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while True:
data = conn.recv(1024)
if not data: break
print data
conn.close()
客户:
import socket
HOST = 'localhost'
PORT = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
s.close()
执行后,我在服务器部分看不到消息print Connected by, addr
和print data
。
我使用的是 Windows 7、Komodo 防火墙(我尝试关闭防火墙,但没有解决问题)、Avast Antivirus、Python 2.7。
非常有趣,没有错误,但输出不起作用。
另外,我的服务器应用程序只是冻结,直到客户端连接到服务器。这可以仅使用线程来解决吗?
提前致谢。
【问题讨论】:
嗨!很高兴您开始使用套接字!但是,如果您不熟悉套接字和线程,那么对您的代码有太多要评论的地方。我建议你看看:twistedtwistedmatrix.com/trac。一个事件驱动的框架,它将为您处理线程!它真的很容易使用! wimps 的框架 =) 实际上,sockets 看起来并不太复杂 【参考方案1】:您需要在循环内使用accept()
和print
。 (或使用两个循环)。我对 Python 中的套接字编程不是很熟悉,但我猜它看起来像这样。 (完全未经测试!)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print 'Connected by', addr
while True:
data = conn.recv(1024)
if not data:
break
print data
conn.close()
【讨论】:
【参考方案2】:+1 致 Cfreak。基本上数据发生的事情是它被分配了一个空字符串,这导致循环中断。因此,将 print 语句放入循环中可以解决问题。假设您需要在循环终止后访问该数据,请尝试类似
data = []
while True:
datum = conn.recv(1024)
data.append(datum)
if not datum: break
print " ".join(data)
这是我正在运行的代码和我的电脑,它可以工作
客户
import socket
HOST = 'localhost'
PORT = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
s.close()
服务器
import socket
HOST = 'localhost'
PORT = 9090
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
data = []
while True:
datum = conn.recv(1024)
data.append(datum)
if not datum: break
print " ".join(data)
conn.close()
所以我认为您的代码没有问题...如果您的机器上没有防火墙/防病毒软件,请尝试该机器上的程序。
【讨论】:
johnthexiii ,我试过你的版本,同样的问题。实际上,问题,也许,这里 "conn, addr = s.accept()" 因为我没有看到字符串 "print 'Connected by', addr",并且这段代码在循环之前 @progerz 您没有看到连接打印语句的事实让我认为这是您的计算机的问题。 我也觉得是电脑的问题...很奇怪的问题...早上(12小时前)一切正常以上是关于Windows 7 上的套接字,无法连接的主要内容,如果未能解决你的问题,请参考以下文章
没有 ConnectEx 的 Windows 上的非阻塞套接字连接
无法在 Windows 2012 MSMQ 中连接 Winsoc 套接字
代理套接字 io 无法与 nginx、docker 上的节点连接