2012-05-12 27 views
2

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

回答

3
  • mylen=len(length)框架并没有给你你想要发送的长度。它会给你在预读的recv中读取多少字节。所以你得到了错误的长度。
  • 在您的客户端,您使用String xyz = in.readLine();这将阻塞,直到遇到换行符。但您永远不会在服务器端发送'\n',而是等待客户端的响应。所以你在那里陷入僵局。
  • 您在接收到的数据上使用data.decode("hex")。除非你在另一边在java中执行data.encode("hex")的等价物,否则这将不起作用。如果字符串不是二进制字符串的有效十六进制表示,它应该给你一个错误。
  • resultarray.array,你写入文件。 file1.write需要一个字符串作为参数,如果您传递result对象,则会出现错误。

,所以我不能甚至可以看到为什么你的代码在所有工作,以及为什么会出现在你的文件在所有的东西。

+0

mylen = len(长度)对我来说是一个愚蠢的错误。我编辑它,它应该是int(长度)。在发送帧的数据之前,我发送服务器应该接收的帧的大小。 – geekoraul

+0

Thankyou mata用于指出readline()中的错误。我期待它会自动检测行/字符串的结尾。 另外我还错误地认为,python字符串将数据编写为“hex”编码。 - 我删除了encode()函数并将'\ n'添加到由服务器发送的'recvd'字符串,并且我能够在我的服务器上获取该框架:)非常感谢! 任何想知道代码的人,请让我知道。 – geekoraul

相关问题