我正在尝试与服务器SSL套接字Java和客户端SSL套接字Python通信。发送的第一条消息是正常的,但是当服务器发送另一条消息时,客户机将接收分成两部分的消息。例如:如果服务器发送消息“abcdefghij”,则客户端接收到第一个“a”,在“bcdefghij”之后。在
有人知道为什么在第一次收到信息后会分成两部分?当做。在
客户代码:
import socket, ssl, pprint
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ssl_sock = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_NONE)
ssl_sock.connect(('localhost', 7000))
pprint.pprint(ssl_sock.getpeercert())
while(1):
print "Waiting"
data = ssl_sock.recv()
print "Received:", data
data = ""
ssl_sock.close()
服务器代码:
^{pr2}$
客户端和服务器端的延迟ACK算法的结合。两个数据包之间也会有大约40毫秒的延迟。在
在服务器端禁用Naggle algo以纠正:
有关发生这种情况的原因的详细信息:http://www.stuartcheshire.org/papers/NagleDelayedAck/
编辑添加:注意下面布鲁诺的回答。虽然这描述了您在这里看到的内容的具体原因,但是您期望从服务器获得数据的方式并不能保证。在
我试图用两种方法来解决我的问题,消息总是在第一个字符处断开,所以我决定在每条消息的开头和结尾添加三个空格。因此,当客户收到它们时,请对消息进行修剪。 我发现的另一种方法是使用DataOutputStream,一个字节一个字节地传递writeBytes的方法,在服务器上使用它,客户端在接收数据时会发生q变化,消息必须构建客户端处理,以最终完成我想要的消息结尾。谢谢你的讨论!在
似乎你希望总是能够从另一端的一个块中读取任何数量的数据。在
这是一个常见的错误,不仅限于SSL/TLS,还与纯TCP通信有关。在
你应该一直循环阅读你想读的东西。您还应该定义您的协议(或使用现有的协议)来考虑命令和请求/响应终止符。在
例如,HTTP使用空行通知头的结尾,
Content-Length
头或分块传输编码告诉接收者何时停止读取正文。在SMTP使用行分隔命令和一个
.
作为消息的结尾。在相关问题 更多 >
编程相关推荐