我有一个使用 Python Imaging Library 绘制图像的服务器端函数。Java 客户端请求一个图像,该图像通过套接字返回并转换为 BufferedImage。
我在数据前面加上要发送的图像大小,然后是 CR。然后我从套接字输入流中读取这个字节数,并尝试使用 ImageIO 转换为 BufferedImage。
在客户端的缩写代码中:
public String writeAndReadSocket(String request) {
// Write text to the socket
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write(request);
bufferedWriter.flush();
// Read text from the socket
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Read the prefixed size
int size = Integer.parseInt(bufferedReader.readLine());
// Get that many bytes from the stream
char[] buf = new char[size];
bufferedReader.read(buf, 0, size);
return new String(buf);
}
public BufferedImage stringToBufferedImage(String imageBytes) {
return ImageIO.read(new ByteArrayInputStream(s.getBytes()));
}
和服务器:
# Twisted server code here
# The analog of the following method is called with the proper client
# request and the result is written to the socket.
def worker_thread():
img = draw_function()
buf = StringIO.StringIO()
img.save(buf, format="PNG")
img_string = buf.getvalue()
return "%i\r%s" % (sys.getsizeof(img_string), img_string)
这适用于发送和接收字符串,但图像转换(通常)失败。我试图理解为什么图像没有被正确读取。我最好的猜测是客户端没有读取正确的字节数,但老实说我不知道为什么会这样。
旁注:
- 我意识到 char[]-to-String-to-bytes-to-BufferedImage Java 逻辑是迂回的,但是直接读取字节流会产生相同的错误。
- 我有一个版本,其中客户端套接字不是持久的,即。处理请求并断开连接。该版本工作正常,因为我不需要关心图像大小,但我想了解为什么建议的方法不起作用。