Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从TCP套接字读取JPEG字节(Android)_Java_Android_Sockets_Tcp_Bitmap - Fatal编程技术网

Java 从TCP套接字读取JPEG字节(Android)

Java 从TCP套接字读取JPEG字节(Android),java,android,sockets,tcp,bitmap,Java,Android,Sockets,Tcp,Bitmap,我有一个应用程序,显示从移动CCTV饲料。我成功开发了iOS应用程序,现在我的客户希望我移植到Android。在我被困在这部分代码之前,移植是很好的 这部分代码,我必须连接到TCP套接字服务器。连接后,我不必向服务器发送任何东西,相反,服务器将向我发送JPEG图像。因此,在连接之后,我必须继续阅读,直到收到JPEG结束标记(0xFF,0xD9),然后关闭连接 我计划做的是 Socket s = new Socket("Server IP Addreess", SERVER_PORT); Data

我有一个应用程序,显示从移动CCTV饲料。我成功开发了iOS应用程序,现在我的客户希望我移植到Android。在我被困在这部分代码之前,移植是很好的

这部分代码,我必须连接到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
}
但是,我也不知道当服务器发送0xFF,0xD9时如何关闭套接字。或者BitmapFactory会检测到该标记并为我关闭套接字连接吗

欢迎提出任何建议。谢谢大家!

另外,我没有测试环境,因为我交付iOS应用程序时,他们收回了测试环境。因此,我必须开发并交付给他们进行测试(通过玩应用程序)。然后,如果它不工作,他们会告诉我纠正它,但我将无法访问LogCat或其他有用的信息。这就像在黑暗的房间里缝扣子一样,我无法开灯

:|

编辑

有关此服务器的详细信息

  • 服务器不会发送文件长度,所以每个文件的字节数未知
  • 我必须检测表示文件结束的0xFF、0xD9
  • 问题是,我必须从我这边终止套接字连接,服务器不会这样做
  • 我不能改变服务器的工作方式,这是我的客户购买的硬件

另外,我会为每个TCP连接获取一个映像,我不会为单个TCP连接获取多个映像。

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


最好是在数据前面加上长度前缀,或者对每个jpeg文件使用单独的TCP连接,并一直读取到连接结束(也就是说,直到您不再获取任何数据)。如果不可能,您必须执行更高级的解析,请参阅。

他们不使用任何特殊协议吗?服务器在发送JPEG后关闭连接?就是这样,服务器不会从他们这边终止连接,我必须自己做。硬件设计有点糟糕。谢谢你的推荐。问题是,我确定的是1。)服务器将始终发送0xFF,0xD9以指示文件的结尾2。)服务器将一次发送一个映像(因此,0xFF,0xD9之后没有任何内容)3。)但是,我必须从我这边关闭套接字连接,服务器不会这样做。(因此,是的,我为每个TCP连接获取一个图像,而不是多个图像)是的,服务器将使用FFD9指示文件结束,但您不能确定FFD9也不在jpeg文件本身中。所以你需要有一个更先进的检测算法,正如我链接的帖子中所描述的。
Socket s = new Socket("Server IP Addreess", SERVER_PORT);
BitmapFactory.decodeStream(s.getInputSteam());