服务器发送消息时Java服务器SSL套接字和Python客户端SSL套接字问题

2024-03-29 14:41:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试与服务器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}$

Tags: 代码服务器消息客户端ssldata客户机socket
3条回答

客户端和服务器端的延迟ACK算法的结合。两个数据包之间也会有大约40毫秒的延迟。在

在服务器端禁用Naggle algo以纠正:

SSLSocket c = (SSLSocket) s.accept();
c.setTcpNoDelay(true);

有关发生这种情况的原因的详细信息:http://www.stuartcheshire.org/papers/NagleDelayedAck/

编辑添加:注意下面布鲁诺的回答。虽然这描述了您在这里看到的内容的具体原因,但是您期望从服务器获得数据的方式并不能保证。在

我试图用两种方法来解决我的问题,消息总是在第一个字符处断开,所以我决定在每条消息的开头和结尾添加三个空格。因此,当客户收到它们时,请对消息进行修剪。 我发现的另一种方法是使用DataOutputStream,一个字节一个字节地传递writeBytes的方法,在服务器上使用它,客户端在接收数据时会发生q变化,消息必须构建客户端处理,以最终完成我想要的消息结尾。谢谢你的讨论!在

似乎你希望总是能够从另一端的一个块中读取任何数量的数据。在

这是一个常见的错误,不仅限于SSL/TLS,还与纯TCP通信有关。在

你应该一直循环阅读你想读的东西。您还应该定义您的协议(或使用现有的协议)来考虑命令和请求/响应终止符。在

例如,HTTP使用空行通知头的结尾,Content-Length头或分块传输编码告诉接收者何时停止读取正文。在

SMTP使用行分隔命令和一个.作为消息的结尾。在

相关问题 更多 >