2017-02-12 14 views
0

私はAndroidには新しく、TCPソケットを開いて特定のポートを聴くタスクがあります。 クライアントアプリケーションは2つの画像とお互いに関連する文字列を送信することになっているので、各データを単独で送信する代わりに、すべてのデータをjsonオブジェクトに入れてこのオブジェクトを送信することを考えました。 私の質問は、どのように私は2つの画像と文字列を保存するこのjsonを解析するのですか? したがって、このJSONは、このようにすることになっている:Android - ソケット経由で複雑なオブジェクトを操作する方法

data 
{ 
    FileName: "some string", 
    Image1: "Image encoded with encode base64", 
    Image2: "Image encoded with encode base64" 
} 

私はここにAsyncTaskを使用しています、私はソケットのデータを取得するコードです:

public class DataRecord 
{ 
    String Image1; 
    String Image2; 
    String FileName; 
} 


protected DataRecord doInBackground(Socket... sockets) { 
DataRecord dataRecord = null; 

if (isExternalStorageWritable() && sockets.length > 0) { 
    Socket socket = sockets[0]; 

    dataRecord = socket.getOutputStream(); // how to extract the data from the socket into this object ??? 

    File file = new File(Environment.getExternalStorageDirectory(), dataRecord.FileName); 

    byte[] bytes = new byte[(int) file.length()]; 
    BufferedInputStream inputStream; 
    try { 
     inputStream = new BufferedInputStream(new FileInputStream(file)); 
     inputStream.read(bytes, 0, bytes.length); 

     OutputStream outputStream = dataRecord.Image1; 
     outputStream.write(bytes, 0, bytes.length); 
     outputStream.flush(); 

     socket.close(); 
    } 
    catch (Exception e) { } 
    finally { 
     try { 
      socket.close(); 
     } catch (IOException e) { } 
    } 
} 
return dataRecord; 
} 

そして、私はからそれを取得する必要がありますソケットオブジェクトを取得し、そこからオブジェクトを抽出して2つのイメージをSDカードに保存し、UIに文字列を抽出します。

+0

ご迷惑をおかけして申し訳ございません。ソケットに書き込むことができれば、読書は問題になるのですか?私にとっては非常に初歩的ですね。その後、...あなたは、これらの3つのパラメータの値をjsonから抽出するのにどのような問題がありますか? – greenapps

+0

ソケットオブジェクトから読み取ることができない理由を理解していません。サーバーはjsonテキストを送信します。それは単なるテキストです。あなたはそれを読むことができます。あなたのクライアントは、そのテキストを入力ストリームから読みとるだけです。 – greenapps

+0

しかし、何とかbase64とjsonを使ってファイルを転送するのは悪い考えです。転送されるバイト数は少なくとも30%増加します。 – greenapps

答えて

0

私はこの質問に複数の回答があると知っていますが、まだ回答を投稿することは良い考えです。 そこで私はこのリンクを見つけましたA Simple Java TCP Server and TCP Client私の解決策を開始するのを助けました。 私はこの素晴らしいチュートリアルを使用してGsonを使用してJSON文字列を解析しました:Android JSON Parsing with Gson Tutorial

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServerSocketThread extends Thread { 
    static final int SocketServerPORT = 6789; 
    ServerSocket serverSocket; 

    @Override 
    public void run() { 
     Socket socket = null; 
     try { 
      serverSocket = new ServerSocket(SocketServerPORT); 
      while (true) { 
       socket = serverSocket.accept(); 
       new FileSaveThread().execute(socket); 
      } 
     } 
     catch (IOException e) { } 
     finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { } 
      } 
     } 
    } 

    protected void onDestroy() { 
     if (serverSocket != null) { 
      try { 
       serverSocket.close(); 
      } 
      catch (IOException e) { } 
     } 
    } 
} 

FileSaveThread.java - これがある: - これは着信ファイルを待ちリスニングサーバー用のJavaクラスである

ServerSockerThread.java: は最後に、私のコードは次のようになります上記のサーバクラスによって着信ファイルごとに呼び出されているJavaクラス:

import android.os.AsyncTask; 
import android.os.Environment; 
import android.util.Base64; 
import com.google.gson.Gson; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.Socket; 

public class FileSaveThread extends AsyncTask<Socket, Void, DataRecord> { 

    @Override 
    protected void onPostExecute(DataRecord dataRecord) { 
     super.onPostExecute(dataRecord);   
    } 

    @Override 
    protected DataRecord doInBackground(Socket... sockets) { 
     DataRecord dataRecord = null; 

     if (isExternalStorageWritable() && sockets.length > 0) { 
      Socket socket = sockets[0]; 
      try { 
       Gson gson = new Gson(); 
       Reader reader = new InputStreamReader(socket.getInputStream()); 
       SocketObject socketObject = gson.fromJson(reader, SocketObject.class);    

       SaveFileToSDCard(socketObject.Image1, "Image1.png"); 
       SaveFileToSDCard(socketObject.Image2, "Image2.png"); 
       SaveFileToSDCard(socketObject.Image3, "Image3.png"); 

       dataRecord = new DataRecord(socketObject.Name); 
      } 
      catch (Exception e) { } 
      finally { 
       try { 
        socket.close(); 
       } catch (IOException e) { } 
      } 
     } 
     return dataRecord; 
    } 

    public boolean isExternalStorageWritable() { 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      return true; 
     } 
     return false; 
    } 

    private void SaveFileToSDCard(String base64String, String fileName) throws IOException { 
     byte[] decodedString = Base64.decode(base64String.getBytes(), android.util.Base64.DEFAULT); 
     File file = new File(Environment.getExternalStorageDirectory(), fileName); 
     FileOutputStream fileOutputStream = new FileOutputStream(file, false); 
     fileOutputStream.write(decodedString); 
     fileOutputStream.close(); 
     fileOutputStream.flush(); 
    } 
} 
関連する問題