2017-01-14 21 views
-1

PCからAndroid Appにテキストを送信し、同じソケットで画像データを送信したいと思います。私はこれをBase64でエンコードしようとしていますが、最後にはpitureが壊れています。 私のコードは次のようになります。BufferWriterとBufferReaderを使用してTCPソケットで画像を送信

データ画面を取得します。

public static byte[] getScreen() 
{ 
    BufferedImage imagebuf = null; 
    try { 
     imagebuf = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
    } catch (HeadlessException | AWTException e) { 
     System.err.println("Can't get screen."); 
     return null; 
    }   

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] imageInByte; 
    try { 
     ImageIO.write(imagebuf, "jpg", baos); 
     baos.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    finally {  
     imageInByte = baos.toByteArray(); 
     try { 
      baos.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return imageInByte; 
} 

はその後ソケットでデータを送信します。

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); 
List<ScreenBuffor> screenList = ScreenBuffor.getScreenList();//Place where I keep all screen data with names 
      if(!screenList.isEmpty()) 
      { 
       for(ScreenBuffor screen : screenList) 
       {      bufferedWriter.write(InformationCommunicate.screenData); 
        bufferedWriter.newLine(); 
        bufferedWriter.flush();      

        bufferedWriter.write(screen.getNameScreen()); 
        bufferedWriter.newLine(); 
        bufferedWriter.flush(); 

        String image = Base64.getEncoder().encodeToString(screen.getDataScreen()); 

        char[] imageCharacter = image.toCharArray(); 
        int sizeArray = imageCharacter.length; 

        bufferedWriter.write(String.valueOf(sizeArray)); 
        bufferedWriter.newLine(); 
        bufferedWriter.flush();      

        bufferedWriter.write(imageCharacter, 0, sizeArray); 
        bufferedWriter.flush();        
       } 
      } 

とAndroid上でこの画像データを読み込み、保存:

InputStream input = clientSocket.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(input, "UTF-8"); 
     BufferedReader reader = new BufferedReader(isr); 

String lineCharacter = reader.readLine(); 

if(lineCharacter.equals(InformationCommunicate.screenData)) 
      { 
       lineCharacter = reader.readLine(); 
       Log.i("PictureSave", "Image name: " + lineCharacter); 
       nameScreen = new String(lineCharacter); 
       lineCharacter = reader.readLine(); 
       Log.i("PictureSave", "Buffor Size: " + lineCharacter); 
       int lengthBuf = Integer.parseInt(lineCharacter); 
       char[] screenCharBuff = new char[lengthBuf]; 
       for(int i = 0; i < lengthBuf; i++) 
       { 
        int onecharacter = reader.read(); 
        if((int) onecharacter == -1) 
         throw new IllegalStateException("Image data is Incomplete"); 
        screenCharBuff[i] = (char) onecharacter; 
       } 

       String imageString = new String (screenCharBuff); 
       byte[] imageData = imageString.getBytes(); 

       File photo=new File(Environment.getExternalStorageDirectory(), "Picture" + lengthBuf + ".jpg"); 


       try { 
        FileOutputStream fos=new FileOutputStream(photo.getPath()); 

        fos.write(imageData); 
        fos.close(); 
       } 
       catch (java.io.IOException e) { 
        Log.e("PictureSave", "Exception in photoCallback", e); 
       } 

画像は保存しているが、私が書いたように、壊れていて、私はそれを開くことができません。助けてください。

答えて

0

base64からエンコードを解除していないので、画像データではなくbase64(画像)を保存しています。最初にデコードするか、まったくエンコードしないかの2つのオプションがあります。本当に私は2番目のオプションを取っています - Base64を使用する唯一の理由は、テキストのみの入力ストリームでバイナリデータを送信することです。ここでは、Base64を使用してテキストのみの入力ストリームがないので、不要で無駄です。

+0

あなたは絶対に正しいです。私はバイト[]データを忘れてしまった。今それは動作します。このアドバイスをありがとう、私はあなたにビールを借りています。 :) – sQanns

関連する問題