2017-10-27 2 views
0

私はこれに永遠に費やしてきたので、うまくいかないようです。私は自分自身を教えていて、これに慣れていないので、是正の質問であれば私を許してください。私はAndroidから.Netサーバーにデータを送信しています。エンコード時にデータが壊れてしまいましたが、私はこれを知っていますが、修正する方法がわかりません。 Microsoft Async Sampleソケット上にファイルをエンコードする

私のAndroidのクライアントコードは次のとおりです:

try { 
      final Socket sock = new Socket(); 
      final int timeOut = (int) TimeUnit.SECONDS.toMillis(5); // 5 sec wait period 
      sock.connect(new InetSocketAddress("localhost", 11000), timeOut); 

      if (sock.isConnected()==true){ 
       BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
       BufferedWriter out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 

       String FileName = "myfile.jpg"; 

       StringBuilder hd = new StringBuilder(); 
       try { 
        String FilePath= Environment.getExternalStorageDirectory() + "/mydir/" + FileName; 
        File file = new File(FilePath); 
        FileInputStream is = new FileInputStream(file); 
        byte[] chunk = new byte[40960]; 
        int chunkLen = 0; 
        while ((chunkLen = is.read(chunk)) != -1) { 
         //String str = new String(Base64.encodeToString(chunk, Base64.NO_WRAP)); 
         //String str = new String(chunk, "ASCII"); 
         String str = new String(chunk, "UTF-8"); 
         out.write(str); 
        } 
        //out.write(hd.toString()); 
       } catch (FileNotFoundException fnfE) { 
        // file not found, handle case 
       } catch (IOException ioE) { 
        // problem reading, handle case 
       } 

       out.write("<EOF>"); 
       out.flush(); 

       StringBuilder returnString = new StringBuilder(); 
       String line; 
       while ((line = in.readLine()) != null) { 
        returnString.append(line).append('\n'); 
       } 

       out.close(); 
       in.close(); 
       sock.close(); 
      }else{ 
       sock.close(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

あなたは私のコメントで見ることができるように、私はBASE64とUTF-8を試してみましたが、私はここで見つけるの.Net非同期サーバーのサンプルコードを使用しています。私はそれを行うときに私はサーバー上ですべての種類のエラーを取得します。 Base64を使用すると、Base64エラー(余分なパディングなど)にはなりません。 UTF8はファイルを書き込みますが、破損しています。 Bytes()= Convert.FromBase64String(FileData)のようにDimを使用しているが、予想通り、大きなファイルのためにAndroidにメモリエラーが発生するので、すべてBase64文字列として送信すると、チャンクが発生します。私はそれと一緒にいくつかのプレーンASCIIテキストを送信しているので、ASCII以外のものを解析してファイルを書き出します。私はスーパースタックしている、どんな助けも大いに感謝されるだろう。前もって感謝します。

答えて

-1

答えが見つかりました。それはとても奇妙だったが、今は理にかなっている。

byte[] chunk = new byte[30000]; 
       int chunkLen = 0; 
       while ((chunkLen = is.read(chunk)) != -1) { 
        String str = new String(Base64.encodeToString(chunk, Base64.NO_WRAP)); 
        out.write(str); 
       } 

チャンクサイズを3の倍数に変更する必要がありましたが、私のbase64エンコードがうまく機能しました。ここでそれを見つけて、投票を行った。ありがとう、「mjv」。 Link to the answer

+0

これが機能するには、サーブが非公開のbase64デコードステップを実装する必要があります。 – EJP

0

エンコードする必要はありません。 OutputStreamを使用してバイトとして直接書き込んでください。よりシンプルで速く、より良い。

+0

私はあなたが正しいことを知っていますが、サーバーはを探していて、ファイルとともに他のデータも送る必要がありました。私はのようなタグを使用していたので、私がやったやり方でした。再び、このドメインの新しいので、私はそれを変更する可能性があります。しかし、これをありがとう。 – nathan

+0

サーバは ''を探すべきではありません。それがファイル内にあればどうなりますか?彼の正しいやり方については、私の答えを複製に見てください。 – EJP

関連する問題