我制作了一个 python“队列”(类似于 JMS 协议),它将接收来自两个 Java 客户端的问题。 python 服务器将从其中一个 Java 客户端接收消息,第二个客户端将读取问题并发布答案。连接和消息传递工作正常,当 Java 客户端用很长的字符串进行应答时,问题就出现了。
python收到的响应不完整!更糟糕的是,消息被剪切为一定数量的字符并且始终保持相同的长度,但是,如果其他人托管服务器,则该数字会有所不同。 (即:friend1 托管服务器,friend2 发送响应,收到的长度:1380 个字符。Friend2 托管服务器,friend1 发布答案,收到的长度:1431 个字符)这是服务器端 python 代码:
s = socket.socket()
host = socket.gethostname()
# host = "192.168.0.20"
port = 12345
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
# print 'Got connection from', addr
message = c.recv(8192) #Is this length a problem?
# print message
message = message.strip()
ipAddress = addr[0]
我在 StackOverflow 上读到问题,c.recv() 对于大量字节应该没有问题,而我们的响应接近 1500 个字符。这是java客户端:
private void openConnection(){
try {
socket = new Socket(HOST, PORT);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
socketPregunta.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e) {}
}
public void sendAnswer(String answer) throws IOException{
openConnection();
out.write("PUBLISH-" + answer); //This answer is send incomplete!
out.flush();
closeConnection();
}
提前致谢!
从文档中:
recv(buffersize[ flags]) -> 数据
从套接字接收最多 buffersize 字节。对于可选的
flags 参数,请参阅 Unix 手册。当没有数据可用时,阻塞
直到至少有一个字节可用或直到远程端
关闭。当远端关闭且所有数据读取完毕后,返回
空字符串。
So recv()
可以返回比您要求的更少的字节,这就是您的情况所发生的情况。网上有这方面的讨论套接字操作方法.
基本上你需要继续打电话recv()
直到您收到完整的消息,或者远程对等方关闭连接(由recv()
返回一个空字符串)。如何做到这一点取决于您的协议。选项有:
- 使用固定大小的消息
- 有某种分隔符或标记来检测消息结束
- 让客户端提供消息长度作为消息的一部分
- 让客户端在发送完消息后关闭连接。显然在这种情况下它将无法收到响应。
查看您的 Java 代码,选项 4 可能适合您,因为它发送消息,然后关闭连接。这段代码应该可以工作:
s = socket.socket()
host = socket.gethostname()
# host = "192.168.0.20"
port = 12345
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
# print 'Got connection from', addr
message = []
chars_remaining = 8192
recv_buf = c.recv(chars_remaining)
while recv_buf:
message.append(recv_buf)
chars_remaining -= len(recv_buf)
if chars_remaining = 0:
print("Exhausted buffer")
break
recv_buf = c.recv(chars_remaining)
# print message
message = ''.join(message).strip()
ipAddress = addr[0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)