基本上,我已经阅读了几个socket.recv()会返回它可以读取的内容,或者一个空字符串表示另一方已关闭(官方文档甚至没有提到它在连接关闭时返回的内容...大!).这对于阻塞套接字来说都很好用,因为我们知道recv()只有当实际有东西要接收时才返回,所以当它返回一个空字符串时,它必须意味着另一方已经关闭了连接,对吧?
好的,很好,但是当我的套接字没有阻塞时会发生什么?我搜索了一下(也许还不够,谁知道?)并且无法弄清楚如何判断对方是否使用非阻塞套接字关闭了连接.似乎没有方法或属性告诉我们这一点,并且将recv()空字符串的返回值进行比较似乎绝对无用......这只是我有这个问题吗?
举一个简单的例子,假设我的套接字超时设置为1.2342342(你喜欢这里的非负数)秒和我打电话socket.recv(1024),但另一方在1.2342342秒期间没有发送任何内容.该recv()调用将返回一个空字符串,我不知道连接是否仍然存在...
我已经在Python 2.7.x中创建了一个基本的客户端服务器套接字程序,即使在不同的机器上也可以在同一个网络上运行,但是当我在不同的网络上运行服务器和客户端时(我朋友的网络上的服务器,而我的客户端)不会返回任何错误并继续等待.我只是无法理解如何调试代码.我通过杀死端口80上的所有服务来使用端口80.我还在两台机器上的端口80上完成了端口转发.
我的代码如下:
client.py
import socket
s = socket.socket()
host = '103.47.59.130'
port = 80
s.connect((host, port))
while True:
print "From Server: ", s.recv(1024) #This gets printed after sometime
s.send(raw_input("Client please type: "))
s.close()
Run Code Online (Sandbox Code Playgroud)
server.py
import socket
s = socket.socket() # Create a socket object
host = '192.168.0.104' #private ip address of machine running fedora
port = 80
s.bind((host, port))
s.listen(5)
c, addr = s.accept()
print 'Got connection from', addr #this line never gets printed
while True:
c.send(raw_input("Server please type: …Run Code Online (Sandbox Code Playgroud) 我在从服务器到客户端接收数据时遇到问题。我有以下客户端函数尝试从服务器接收数据。服务器使用该socket.sendall (data)函数发送的数据大于buff_size所以我需要一个循环来读取所有数据。
def receiveAll (sock):
data = ""
buff_size = 4096
while True:
part = sock.recv (buff_size)
data + = part
if part <buff_size:
break;
return data
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在第一次迭代(读取第一个 4096mb)之后,第二次程序被阻塞,等待part = sock.recv (buff_size). 我该怎么做recv()才能继续读取其他丢失的数据?谢谢你。