【发布时间】:2012-06-12 21:53:52
【问题描述】:
我有一个使用 Python 图像库绘制图像的服务器端函数。 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 逻辑是迂回的,但是直接读取字节流会产生同样的错误。
- 我有一个这样的工作版本,其中客户端套接字不是持久的,即。处理请求并断开连接。该版本运行良好,因为我不需要关心图像大小,但我想了解为什么建议的方法不起作用。
【问题讨论】:
-
将二进制转换为文本通常是一个非常糟糕的主意(很多事情可能会出错)为什么不直接将二进制数据发送到您的服务器?
-
你绝对是对的。我在化学实验室工作,我们历来忽略任何不能直接转化为论文的东西。我正在努力解决这个问题,但我并不是一个经验丰富的编码员。
标签: java python sockets twisted