2015-01-21 107 views
1

我有一个应用程序,显示来自手机的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连接的多个图像。

+0

他们不使用任何特殊协议?服务器在发送JPEG后关闭连接? – Dario 2015-01-21 08:05:25

+0

就是这样,服务器不会从他们那边终止连接,我必须自己做。这是一个不好的硬件设计。 – 2015-01-21 08:17:28

回答

2

这是一个坏主意,只是寻找一些神奇的字节来确定数据的结束。虽然这些魔术字节应该在文件末尾,但它们也可能发生在数据内部。

更好的办法是将数据加上长度前缀,或者对每个jpeg文件使用单独的TCP连接,直到连接结束(直到您没有获得更多数据)为止。如果这不可行,则必须进行更高级的解析,请参阅Detect Eof for JPG images

+0

感谢您的称赞。事情是,我知道肯定是1.)服务器将始终发送0xFF,0xD9表示文件2的结尾。)服务器会一次发送一个图像(因此,0xFF,0xD9之后没有任何内容)3.)但是,我必须关闭来自我身边的套接字连接,服务器不会这样做。 (所以,是的,我为每个TCP连接获取一个图像,而不是多个图像) – 2015-01-21 08:09:16

+0

是的,服务器会用FFD9指示文件末尾,但不能确定FFD9不在jpeg文件本身内。所以你需要有一个更高级的检测算法,如我已经链接的文章中所述。 – 2015-01-21 08:16:14

+0

我现在明白了你的观点。 – 2015-01-21 08:20:41