【发布时间】:2016-02-23 19:34:26
【问题描述】:
我目前正在测试我计划最终编写的小型游戏所需的编程技能,而我目前正忙于通过套接字通道传输图像。我计划通过向你的对手发送某种“头像”或“头像”来在我编写的“战舰”程序上对此进行测试。 我有一个使用普通套接字的工作示例:
服务器端:
try {
ServerSocket serverSocket = new ServerSocket(port); //provided at an earlier point in the code
Socket server = serverSocket.accept();
BufferedImage img = ImageIO.read(ImageIO.createImageInputStream(server.getInputStream()));
//here would be code to display the image in a frame, but I left that out for readability
server.close();
serverSocket.close();
} catch(Exception e) { //shortened version to improve readability
e.printStackTrace();
}
客户端:
Socket client = new Socket(ip, port);
bimg = ImageIO.read(getClass().getResource("/images/ship_1.jpeg"));
//the image is located at /resources/images/ship_1.jpeg
ImageIO.write(bimg,"JPG",client.getOutputStream());
client.close();
到目前为止,一切正常。
现在,socketChannels (Java NIO) 的问题:
客户端:
BufferedImage bimg = ImageIO.read(getClass().getResource("/images/ship_1.jpeg"));
ByteArrayOutputStream outputArray = new ByteArrayOutputStream();
//i do NOT know if the following line works - System.out.println() statements after it are not executed, so ... probably doesn't work either.
ImageIO.write(bimg, "jpeg", socketChannel.socket().getOutputStream());
服务器端:
ByteBuffer imgbuf = ByteBuffer.allocate(40395);
int imageBytes = socketChannel.read(imgbuf);
while (true) {
if (imageBytes == (0 | -1)) {
imageBytes = socketChannel.read(imgbuf);
} else {
break;
}
}
byte[] byteArray = imgbuf.array();
System.out.println(byteArray.length);
InputStream in = new ByteArrayInputStream(byteArray);
BufferedImage img = ImageIO.read(in);
到目前为止,我还没有真正处理过图像,所以我在使用缓冲区或任何我找不到的东西时可能会出现一些错误。
无论如何,如果我执行程序(使用许多不同的代码都可以正常工作),我会在我为服务器端提供的最后一行收到一个异常:javax.imageio.IIOException: Invalid JPEG file structure: missing SOS marker
任何帮助将不胜感激!
【问题讨论】:
-
您是否尝试过使用ImageOutputStream 类来发送图像?
-
通常,通过套接字发送任意大小的二进制数据的最佳方式是先发送长度,然后发送数据。这使接收者可以准确地知道预期有多少数据并采取适当的行为。
-
@jtahlborn 是的,我稍后会改变它。但是,考虑到我知道测试图像的大小,我只是在这里硬编码了大小。
-
@JonahHaney 那么我将如何编写我的代码呢?我仍在使用套接字通道:/
-
注意:我找到了解决方案,无需编写其他答案 - 我会自己为未来的读者回答。本质上,我将图像转换为字节数组,然后将其发送到服务器。
标签: java image nio socketchannel