2012-05-12 2 views
2

나는 JPEG 형식의 프레임을 BufferedArrayOutputStream (코드에서 baos 변수)에 할당해야하는 안드로이드 애플리케이션을 개발 중이다. 이 소켓을 바이트 배열로 변환하여 소켓에 씁니다. 서버 쪽에서 jpeg 형식으로 이미지를 재구성하고 싶습니다. 변수를받은 데이터를 서버의 '.jpg'파일에 씁니다. 파일을 열면 "ffx0이 아니라 jpeg 형식이 아닌 파일"과 같은 오류가 발생합니다. 이것은 파이썬의 문자열 변수가 파일의 데이터를 16 진수 문자열로 기록하기 때문입니다. 클라이언트 코드는 다음과 같다 : -jpeg 프레임을 자바 클라이언트에서 파이썬 서버로 스트리밍하는 방법

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() 

사람이 나 서버 중 하나 파이썬 또는 C++

답변

3
  • mylen=len(length)에 프레임을 재구성하는 방법을 알려 주시기 바랍니다 보낼 길이를 알려주지 않습니다. 얼마나 많은 바이트가 previsous recv에서 읽혔는지 알려줍니다. 그래서 당신은 틀린 길이를 거기에서 얻습니다.
  • 클라이언트쪽에는 줄 바꿈 문자가 나타날 때까지 차단되는 String xyz = in.readLine();을 사용합니다. 하지만 서버 쪽에서 결코 '\n'을 보내지는 않습니다. 대신 클라이언트의 응답을 기다리고 있습니다. 거기에 교착 상태가 발생했습니다.
  • 귀하는 수신 된 데이터에 data.decode("hex")을 사용합니다. 반대쪽 java에서 data.encode("hex")의 등가물을 수행하지 않으면 작동하지 않습니다. 문자열이 2 진 문자열의 유효한 16 진수 표현이 아닌 경우 오류가 발생합니다.
  • result은 파일에 쓸 array.array입니다. file1.write은 문자열을 인수로 예상하므로 result 객체를 전달하면 오류가 발생합니다.

그래서 코드가 전혀 작동하지 않는 이유와 왜 파일에 아무 것도없는 이유를 볼 수 없습니다.

+0

mylen = len (길이)은 내 부분에서 어리석은 실수였습니다. 나는 그것을 편집했으며 int (길이) 여야합니다. 프레임의 데이터를 보내기 전에 서버가 수신해야하는 프레임의 크기를 보내고 있습니다. – geekoraul

+0

readline()에서 오류를 지적 해 주셔서 감사합니다. 나는 그것이 자동으로 라인/문자열의 끝을 감지 할 것으로 예상했다. 플러스 나는 또한 파이썬 문자열을 "16 진수"로 인코딩 된 데이터를 썼다는 생각에 착각했습니다. - encode() 함수를 제거하고 서버에서 'recvd'문자열을 보내고 '\ n'을 추가하면 서버에서 프레임을 가져올 수있었습니다 :) 감사합니다. 코드를 알고 싶다면 알려주세요. – geekoraul

관련 문제