2013-01-05 17 views
5

受信した1枚の画像を表示できますが、今度は5秒ごとにAndroidクライアントから送信される複数の画像をディスクに送受信したいと考えています。datainputstreamを使用してソケットから読み取る方法

Socket sock = servsock.accept(); 
dataInputStream = new DataInputStream(sock.getInputStream()); 
dataOutputStream = new DataOutputStream(sock.getOutputStream()); 
System.out.println("Accepted connection : " + sock); 

dataInputStream = new DataInputStream(sock.getInputStream()); 

byte[] base64=dataInputStream.readUTF().getBytes(); 

byte[] arr=Base64.decodeBase64(base64); 

FileOutputStream imageOutFile = new FileOutputStream("E:\\image.jpeg"); 
imageOutFile.write(arr); 

答えて

3

あなたは、クライアントとサーバ間のプロトコルを構築する必要があります。

イメージのサイズが一定の場合は、入力ストリームをループして、一定のバイト数が得られ、すでにバッファリングされているイメージをすべて書き込むまでバッファリングしてください。

それ以外の場合は、画像のサイズを示すメタデータを追加する必要があります。例えば[サイズ-i]のスペースの一定量を占有し、[画像-i]はi番目の画像のサイズと

[size1][image1][size2][image2][size3][image3] 

:あなたは、このような単純な形式を使用することができます。

しかし、クライアント、ネットワーク、またはサーバーのために正確な時間が各画像間で大きく異なる可能性があるため、画像処理、5秒間のスリープ、および次の取得のような素朴なプロトコルを実行するように誘惑されることはありません(あなたのコードおよび/またはファイルシステム)。

2

リトル変更:

Socket sock = servsock.accept(); 
dataInputStream = new DataInputStream(sock.getInputStream()); 
dataOutputStream = new DataOutputStream(sock.getOutputStream()); 
System.out.println("Accepted connection : " + sock); 

int imagesCount = dataInputStream.readInt(); 
for (int imgNum = 0; imgNum < imagesCount; imgNum++) { 
    int imgLen = dataInputStream.readInt(); 
    byte[] base64 = new byte[imgLen]; 
    dataInputStream.readFully(base64); 

    byte[] arr = Base64.decodeBase64(base64); 

    FileOutputStream imageOutFile = new FileOutputStream("E:\\image"+imgNum+".jpeg"); 
    imageOutFile.write(arr); 
} 
+1

VGしかし、私はBase64エンコーディングを取り除き、DataInputStream.readFully()を使用します。 – EJP

+1

この場合... 'for(.....){ int imgLen = dataInputStream.readInt(); byte [] arr =新しいバイト[imgLen]; dataInputStream.readFully(arr); // [... cut ...] ' – ggrandes

+0

このエラーが発生していますスレッド" main "の例外java.lang.OutOfMemoryError:Javaヒープスペース \t at server.main(server.java:52) –

0

あなたが複数のクライアントと単一のサーバがある場合。マルチスレッドを試してみてください。コードのサンプル片:あなたの「ファイル名を指定して実行」で

public static void main(String[] args){ 
    try { 
     servSocket = new ServerSocket(xxxx); 

     while(true) 
     { 

      socket = servSocket.accept(); 

      ClientNum++; 

      for(int i=0;i<10;i++){ //this for eg accepts 10 clients, with each client assigned an ID. 

       if(threads[i]==null){ 
        sockets[i]=socket; 

、あなたは、それぞれのIDによってこれらのクライアントのそれぞれを呼び出し、必要なREQD機能を実行することができます。これがどれほど明確かわかりません。必要に応じて、あなたがやっていることにちょっと似ているコード全体を送ることができます。

関連する問題