Python TCP socket.recv()在建立连接后立即返回,但不返回任何内容
我正在尝试实现最基本的python TCP服务器。Windows 8、Python 2.7、防火墙已关闭。代码来自此处: 如果我通过python repl执行客户机操作(Python TCP socket.recv()在建立连接后立即返回,但不返回任何内容,python,sockets,tcp,client,Python,Sockets,Tcp,Client,我正在尝试实现最基本的python TCP服务器。Windows 8、Python 2.7、防火墙已关闭。代码来自此处: 如果我通过python repl执行客户机操作(socket(…)、connect(…)、send(…)),一切正常,即服务器在调用recv时会正确阻塞 但是,如果我通过python脚本运行完全相同的代码(在windows命令行中有或没有显式调用python.exe),则recv会立即返回,而不会返回任何数据。我在其他地方读到,这意味着它是一个无效的套接字,但我不确定这意味着
socket(…)、connect(…)、send(…)
),一切正常,即服务器在调用recv
时会正确阻塞
但是,如果我通过python脚本运行完全相同的代码(在windows命令行中有或没有显式调用python.exe),则recv
会立即返回,而不会返回任何数据。我在其他地方读到,这意味着它是一个无效的套接字,但我不确定这意味着什么,或者如何检查它。我使用的是accept()
返回的套接字,而不是用于启动连接的套接字
我试图阻止recv
,这样我就可以利用超时(我不想使用select模块,顺便说一句,它也会立即返回)并在尝试recv
之间处理一些键盘内容,即用户按“q”退出
在各种实验中,我已经证明,一旦发生这种情况,recv
总是会立即返回(就像select.select(…)
)一样,如果我将它放入循环中,那么它就不会像客户机最初发送一个“坏”数据包一样。如果客户机碰巧发送了某个数据,那么recv
会返回该数据,但它肯定不会阻止在紧密循环中等待数据
这是预期的行为吗
服务器代码:
import sys
import socket
TCP_IP = '192.168.1.10'
TCP_PORT = 5005
BUFFER_SIZE = 20 # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connection address:', addr
while 1:
data = conn.recv(BUFFER_SIZE) # This returns immediately with no data, when client connection is run from script and doesn't send() anything, just connects.
if not data:
print "broken"
break
print "received data:", data
conn.send(data) # echo
conn.close()
sys.exit()
客户端代码:
import sys
import socket
TCP_IP = '192.168.1.10'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "Hello, World!"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
# Commenting out the following to prove the recv() call on the other
#end returns with nothing instead of blocking indefinitely. If I
#type the rest of this at the REPL the server behaves correctly,
#ie, the recv call blocks forever until socket.send("bla") from client.
#s.send(MESSAGE) data = s.recv(BUFFER_SIZE)
#s.close()
#print "received data:", data
sys.exit()
是的,这是预期的行为 客户端不发送任何内容。并在连接到服务器后立即退出;导致断开连接 如果对等机执行关机(断开连接),则返回空字符串
而在REPL中,只有在发出
sys.exit()
或退出交互式shell后,套接字才会关闭。谢谢。我通过a)在True时执行:在客户端脚本上传递循环,服务器recv
被阻塞,然后b)手动逐行从python repl连接,服务器端recv
被解锁,在我从客户端python repl执行s.close()
时没有传递任何数据来验证这一点。