python – 当保持客户端套接字打开以发送多条消息时,为什么程序在消息有很大延迟时会出错?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 当保持客户端套接字打开以发送多条消息时,为什么程序在消息有很大延迟时会出错?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2417字,纯文字阅读大概需要4分钟。
内容图文
![python – 当保持客户端套接字打开以发送多条消息时,为什么程序在消息有很大延迟时会出错?](/upload/InfoBanner/zyjiaocheng/703/b9cb7f1f373345b48032f987471631f8.jpg)
有一个服务器可以监听连接.客户端套接字连接到服务器并在关闭之前在循环中多次调用sendall().但是,如果任何迭代需要一段时间,则会出现ConnectionAbortedError.
有一个循环从0到9,在每次迭代中,都有一个使用客户端套接字的sendall().为了创建一个延迟,我添加了一个虚拟while循环,它只增加了一些变量.
服务器代码的相关部分
with socket.socket() as s:
s.bind(('127.0.0.1', 65432))
s.listen()
while True:
connection, address = s.accept()
with connection:
data = connection.recv(72)
print('Client says "{}"'.format(data))
客户端代码
with socket.socket() as s:
s.connect((host, port))
for i in range(10):
s.sendall(bytes("message {}".format(i+1), encoding='utf-8'))
if i+1 == 3:
count = 0
while count < 12000:
count += 1
像500这样的while循环计数的一个小限制可以正常工作.但是,5000以上的东西似乎会导致错误.我不清楚他们为什么会给出不同的结果.
解决方法:
您的服务器从客户端只读取一次,最多接收72个字节,然后关闭连接.如果客户端可以足够快地发送所有10条消息,则不会出现错误.了解Nagle Algorithm:
inhibit[s] the sending of new TCP segments when new outgoing data arrives from the user if any previously transmitted data on the connection remains unacknowledged.
您的服务器永远不会收到所有消息(总共91个字节),但如果客户端全部发送,则客户端不会出错.
对服务器的一个小改动通过等待客户端关闭连接来确保它接收所有数据(无论延迟):
with connection:
while True:
data = connection.recv(72)
if not data: break # empty data means client closed connection.
print('Client says "{}"'.format(data))
这仍然不会一个接一个地收到消息. TCP是一种流协议,因此消息可以连接在一起.您需要添加缓冲和从中提取完整消息的方法.示例(Python 3.6):
client.py
import socket
host = '127.0.0.1'
port = 65432
with socket.socket() as s:
s.connect((host, port))
for i in range(10):
# Use newline as message delimiter.
s.sendall(f'message {i+1}\n'.encode())
server.py
import socket
with socket.socket() as s:
s.bind(('127.0.0.1', 65432))
s.listen()
while True:
connection, address = s.accept()
with connection:
data = b''
while True:
chunk = connection.recv(16)
if not chunk: break # client closed connection
data += chunk # buffer input
while b'\n' in data: # break off messages and display
msg,_,data = data.partition(b'\n')
print(f'Client says "{msg.decode()}"')
if data:
print(f'Incomplete message: {data}')
输出:
Client says "message 1"
Client says "message 2"
Client says "message 3"
Client says "message 4"
Client says "message 5"
Client says "message 6"
Client says "message 7"
Client says "message 8"
Client says "message 9"
Client says "message 10"
内容总结
以上是互联网集市为您收集整理的python – 当保持客户端套接字打开以发送多条消息时,为什么程序在消息有很大延迟时会出错?全部内容,希望文章能够帮你解决python – 当保持客户端套接字打开以发送多条消息时,为什么程序在消息有很大延迟时会出错?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。