仅在成功传输后关闭 Greenlet 中的 TCP 套接字
Close TCP socket in the Greenlet only after successful transfer
我在这里尝试仅在成功传输所有数据后关闭我的 TCP 套接字:
from gevent import monkey; monkey.patch_all()
import gevent
import socket
host = "127.0.0.1"
port = 8888
line_term = "\r\n"
login_str = ["Action: Login",
"ActionID: 1",
"Username: ami",
"Secret: password",
]
def login(login_str):
conn = socket.create_connection([host, port])
for i in login_str:
conn.sendall(i + line_term)
conn.send(line_term)
# Everything works, as soon as I uncomment this line below :/
# gevent.sleep(1)
conn.close()
g1 = gevent.spawn(login, login_str)
g1.join(timeout=2)
看来,套接字关闭得太早了,因为我总是在另一端只收到 login_str
的前两行。如果我取消注释 gevent.sleep(1)
- 一切都按预期进行。但我怀疑情况是否如此,如果我尝试发送 1000 行或使用抖动连接,可能需要的超时时间为 2 秒。这是不可预测的,也是异步的不可取的副作用。编程,据我所知,所以我很确定一定有一个简单的解决方法,但我找不到?
编辑
为了完整起见,我还添加了回显服务器部分:
from gevent.server import StreamServer
def connection_handler(socket, address):
for l in socket.makefile('r'):
print str(len(l)) + ' : ' + l
socket.sendall(l)
if __name__ == '__main__':
server = StreamServer(('0.0.0.0', 8888), connection_handler)
server.serve_forever()
在您的服务器代码中,您正在向发件人回显您阅读的每一行 (socket.sendall(l)
)。但是,在您的客户端代码中,您将在发送完所有数据后立即关闭连接,这让您的服务器没有机会发回数据。如果您注释掉 socket.sendall(l)
,您会发现您确实收到了所有四行。
如果确实需要回传数据,可以修改客户端代码等待服务器发送完所有数据:
def login(login_str):
conn = socket.create_connection([host, port])
for i in login_str:
conn.sendall(i + line_term)
conn.send(line_term)
# Wait until the other end has finished sending data
while conn.recv(1024):
pass
# Everything works, as soon as I uncomment this line below :/
# gevent.sleep(1)
conn.close()
我在这里尝试仅在成功传输所有数据后关闭我的 TCP 套接字:
from gevent import monkey; monkey.patch_all()
import gevent
import socket
host = "127.0.0.1"
port = 8888
line_term = "\r\n"
login_str = ["Action: Login",
"ActionID: 1",
"Username: ami",
"Secret: password",
]
def login(login_str):
conn = socket.create_connection([host, port])
for i in login_str:
conn.sendall(i + line_term)
conn.send(line_term)
# Everything works, as soon as I uncomment this line below :/
# gevent.sleep(1)
conn.close()
g1 = gevent.spawn(login, login_str)
g1.join(timeout=2)
看来,套接字关闭得太早了,因为我总是在另一端只收到 login_str
的前两行。如果我取消注释 gevent.sleep(1)
- 一切都按预期进行。但我怀疑情况是否如此,如果我尝试发送 1000 行或使用抖动连接,可能需要的超时时间为 2 秒。这是不可预测的,也是异步的不可取的副作用。编程,据我所知,所以我很确定一定有一个简单的解决方法,但我找不到?
编辑
为了完整起见,我还添加了回显服务器部分:
from gevent.server import StreamServer
def connection_handler(socket, address):
for l in socket.makefile('r'):
print str(len(l)) + ' : ' + l
socket.sendall(l)
if __name__ == '__main__':
server = StreamServer(('0.0.0.0', 8888), connection_handler)
server.serve_forever()
在您的服务器代码中,您正在向发件人回显您阅读的每一行 (socket.sendall(l)
)。但是,在您的客户端代码中,您将在发送完所有数据后立即关闭连接,这让您的服务器没有机会发回数据。如果您注释掉 socket.sendall(l)
,您会发现您确实收到了所有四行。
如果确实需要回传数据,可以修改客户端代码等待服务器发送完所有数据:
def login(login_str):
conn = socket.create_connection([host, port])
for i in login_str:
conn.sendall(i + line_term)
conn.send(line_term)
# Wait until the other end has finished sending data
while conn.recv(1024):
pass
# Everything works, as soon as I uncomment this line below :/
# gevent.sleep(1)
conn.close()