Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TCP socket.recv()在建立连接后立即返回,但不返回任何内容_Python_Sockets_Tcp_Client - Fatal编程技术网

Python TCP socket.recv()在建立连接后立即返回,但不返回任何内容

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会立即返回,而不会返回任何数据。我在其他地方读到,这意味着它是一个无效的套接字,但我不确定这意味着

我正在尝试实现最基本的python TCP服务器。Windows 8、Python 2.7、防火墙已关闭。代码来自此处:

如果我通过python repl执行客户机操作(
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()
时没有传递任何数据来验证这一点。