java - 如何将 jpeg 帧从 java 客户端流式传输到 python 服务器

标签 java c++ python sockets jpeg

我正在开发一个android应用程序,其中我必须发送分配给BufferedArrayOutputStream(代码中的baos变量)的jpeg格式的帧。我将这个 baos 转换为字节数组以写入套接字。 在服务器端,我想以 jpeg 格式重建图像。如果我将变量中接收到的数据写入服务器上的“.jpg”文件,则在打开该文件时,会出现“文件以 ffx0 开头而不是 jpeg 格式”之类的错误。我认为这是因为python中的字符串变量将文件中的数据作为十六进制字符串写入。 客户端代码如下:-

Bitmap memoryImage = Bitmap.createBitmap(rgb, previewSize.width,previewSize.height,Bitmap.Config.ARGB_8888);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(memoryImage.compress(CompressFormat.JPEG,100, baos)){
    try {
        if(count==0){
            byte [] Finalbaos = baos.toByteArray();
            int tempLen = Finalbaos.length;
            Log.v("Client","ImageBytes :"+ tempLen);
            String dataMeta = Integer.toString(tempLen);
            Log.v("Client","Integer Size :"+ dataMeta.length());
            PrintWriter tempOut = new PrintWriter(socket.getOutputStream());
            if(tempOut!=null){
                tempOut.write(dataMeta);
                Log.v("Client","data size sent");
                tempOut.flush();
            }

            DataInputStream in = new DataInputStream(socket.getInputStream());
            if(in!=null){
                Log.v("Client","read buffer created");
                String xyz = in.readLine();
                String temp = "recvd";
                Log.v("Client",xyz);
                if(xyz.equals(temp)){
                    OutputStream out = socket.getOutputStream();
                    out.write(Finalbaos,0,tempLen);
                    out.flush();
                    Log.d("Client", "Client sent message");
                }
            }

服务器代码:

import socket,thread
import string
import array
host=""
port=54321
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(5)
conn,address=s.accept()
data=""
mylen=0
dataRecv=0
file1 = open("myfile.jpg","w")
totalLength=""
length=conn.recv(1024)
conn.send("recvd")
mylen=int(length)

while dataRecv<mylen:
    newData=""
    newData=conn.recv(1)
    if not newData:
        break
    data+=newData
    dataRecv+=len(newData)

result= array.array('B',data.decode("hex"))
file1.write(result)
file1.close()
print len(data)
conn.close()
s.close()

谁能告诉我如何用 python 或 C++ 重建服务器上的框架

最佳答案

  • mylen=len(length)没有给你你想要发送的长度。它给出了在之前的 recv 中读取了多少字节。 。所以你得到的长度是错误的。
  • 在您的客户端,您使用 String xyz = in.readLine();它将阻塞直到遇到换行符。但你从来没有发送过 '\n'在服务器端,您会等待客户端的响应。所以你陷入了僵局。
  • 您使用 data.decode("hex")关于您收到的数据。除非你做相当于 data.encode("hex") 的事情另一方面,在java中,这是行不通的。如果该字符串不是二进制字符串的有效十六进制表示形式,它应该会给您一个错误。
  • resultarray.array ,您写入文件。 file1.write需要一个字符串作为参数,如果你传递 result ,它会给你一个错误对象。

所以我什至看不到为什么你的代码可以工作,以及为什么你的文件中有任何东西。

关于java - 如何将 jpeg 帧从 java 客户端流式传输到 python 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561010/

相关文章:

java - Swing 复选框

c++ - 使用模板参数更改类的行为

python - Python处理文件时出现内存错误

python - 在 Linux 上使用 python 获取 USB 驱动器唯一 ID 的最简单方法是什么?

c# - 如何在 Node.js 中解压一个 c# 打包的结构

python - 基于正则表达式/自由文本解析文本文件

java - 在 mvn 中定义 $JAVA_HOME

java - 如何在tomcat负载均衡中管理 session ?

java - 如何在 Hibernate 中使用急切实例化?

c++ - 模板函数中的静态变量失败