2

私は BufferedArrayOutputStream (コードの baos 変数) に割り当てられた jpeg 形式でフレームを送信する必要があるアンドロイド アプリケーションを開発しています。このバオスをバイト配列に変換してソケットに書き込みます。サーバー側では、画像を jpeg 形式で再構築したいと考えています。変数で受信したデータをサーバー上の '.jpg' ファイルに書き込むと、ファイルを開くときに「jpeg 形式ではなく ffx0 で始まるファイル」のようなエラーが表示されます。これは、python の文字列変数がファイル内のデータを 16 進文字列として書き込むためだと思います。クライアントコードは次のとおりです:-

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++でサーバー上のフレームを再構築する方法を誰か教えてください

4

1 に答える 1

3
  • mylen=len(length)送信しようとしている長さがわかりません。前の で読み取られたバイト数がわかりrecvます。そのため、間違った長さになります。
  • クライアント側ではString xyz = in.readLine();、改行文字が検出されるまでブロックする which を使用します。ただし'\n'、サーバー側で送信することはありません。代わりに、クライアントからの応答を待ちます。そのため、そこでデッドロックが発生します。
  • data.decode("hex")受信したデータに使用します。data.encode("hex")反対側で in Javaと同等のことをしない限り、それはうまくいきません。文字列がバイナリ文字列の有効な 16 進数表現でない場合、エラーが発生するはずです。
  • resultファイルにarray.array書き込む です。file1.write引数として文字列を想定しているため、オブジェクトを渡すとエラーが発生しresultます。

そのため、なぜあなたのコードが機能するのか、なぜあなたのファイルに何かが含まれているのかさえわかりません。

于 2012-05-12T06:04:03.860 に答える