我有一个应用程序,显示来自手机的CCTV馈送。我成功地开发了iOS应用程序,现在我的客户想让我移植到Android。移植是好的,直到我被困在这部分代码中。从TCP套接字(安卓)读取JPEG字节
这部分代码,我必须连接到TCP套接字服务器。连接时,我不必向服务器发送任何东西,相反,服务器会向我发送一个JPEG图像。所以,连接后,我必须继续阅读,直到我收到JPEG结束标记(0xFF,0xD9),然后关闭连接。
我打算做的是
Socket s = new Socket("Server IP Addreess", SERVER_PORT);
DataInputStream dis = new DataInputStream(socket.getInputStream());
ArrayList<Byte> bytes = new ArrayList<Byte>();
boolean err = false;
while (true) {
byte b = dis.readByte();
if (b == -1) {
err = true;
break;
}
bytes.add(b);
if ((bytes.get(bytes.size() - 1) == (byte) 0xFF) &&
(bytes.get(bytes.size() - 2) == (byte) 0xD9)) {
break;
}
}
socket.close();
if (!err) {
// create bitmap from byte array and show in ImageView
}
但我不知道这是否正确。另一种解决方案,我想的是
Socket s = new Socket("Server IP Addreess", SERVER_PORT);
BitmapFactory.decodeStream(s.getInputSteam());
但是,另外,我不知道如何关闭套接字时服务器发送0xFF的,0xD9。或者,BitmapFactory会为我检测标记并关闭套接字连接?
欢迎任何建议。谢谢!
P.S.当我提供iOS应用时,我没有测试环境。所以,我必须开发并交付给他们测试(通过与应用程序一起玩)。如果它不工作,他们会告诉我纠正它,但我将无法访问LogCat或其他有用的信息。这就像试图在黑暗的房间里缝一个按钮,我不能打开灯。
:| |
编辑
关于该服务器的更多信息
- 服务器将不会发送长度的文件的,所以,对于每个文件的字节数是未知的。
- 我必须检测0xFF,0xD9表明文件结束。
- 问题是,我必须从我身边终止套接字连接,服务器不会这样做。
- 我无法改变服务器的工作方式,这是我的客户购买的硬件。
另外,我得到每个TCP连接一个图像,我没有得到单个TCP连接的多个图像。
他们不使用任何特殊协议?服务器在发送JPEG后关闭连接? – Dario 2015-01-21 08:05:25
就是这样,服务器不会从他们那边终止连接,我必须自己做。这是一个不好的硬件设计。 – 2015-01-21 08:17:28