2012-02-13 8 views
3

文字列の一部を送信し、それが送信されたデータをエンコードしようとしています。 その部分は正しく動作していますが、なんらかの理由で、エンコードされた文字列全体をソケットに送信しません。のPrintWriterは唯一私がJavaでいくつかのソケットの仕事をやってるのJava

private void sendFile(File f, String dest){ //The file to be sent and the destination 
     System.out.println("Sending file started.."); 

     try { 
      this.out.println("CMD MKFILE " + dest + "/" + f.getName()); 
      //TODO send the file 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

クライアントが受け取る:クライアントが(以下である)MyBufferedReaderクラスから簡単なのreadLine()を実行し、サーバはこのようにそれを送ります。3.

の部分でそれを送るように見えますこの: CMD MKFILE C:\Users\Lolmewn\Documents\test/dir/n/linebreaと次々MyBufferedReaderとMyPrintWriterクラスは次のようになりk!.txt

をお読みください。

MyBufferedReader:

@Override 
    public String readLine() throws IOException { 
     String read = super.readLine(); 
     System.out.println("UNDEC: " + read); 
     try { 
      System.out.println("DEC: " + decode(read)); 
      return decode(read); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return read; 
    } 

    public static String decode(String b) throws Exception { 
     ByteArrayInputStream bais = new ByteArrayInputStream(b.getBytes("UTF-8")); 
     InputStream b64is = MimeUtility.decode(bais, "base64"); 
     byte[] tmp = new byte[b.length()]; 
     int n = b64is.read(tmp); 
     byte[] res = new byte[n]; 
     System.arraycopy(tmp, 0, res, 0, n); 
     return new String(res); 
    } 

とMyPrintWriter:

何が起こっている
private String hash(String x) { 
     try { 
      return encode(x); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return x; 
    } 

    public static String encode(String b) throws Exception { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     OutputStream b64os = MimeUtility.encode(baos, "base64"); 
     b64os.write(b.getBytes("UTF-8")); 
     b64os.close(); 
     return new String(baos.toByteArray()); 
    } 

とどのように私はこの問題を解決することができますか?

ノートを行ってください:私はちょうどしばらく(!読ん= null)の文を使用しないことができることを意味し、これらのソケット上の非同期作業をしています。そうすれば他のデータもそこに存在しないはずです。

答えて

1

まずこの脇:あなたが複数のスレッド/クライアントから送信されているなら、あなたは(のような(受け入れる)し)それらのそれぞれに1つのソケットを開く必要があり、異なるクライアントからそのようにメッセージがお互いをインターリーブすることはできません。今

私は(合理的)ソケットごとに1つだけのクライアントを想定しています:私はちょうどしばらく使用することはできません

あなたはシンプルに実装する必要があり(読み= nullを!)プロトコルでは、1つのメッセージを次のメッセージと区別することができます。それがデータの一部であることができない場合は0バイトを使用するか、メッセージの長さをメッセージの先頭に付けて両方を送信します。サーバーが次のメッセージと区別できるようにします。

+0

私は前に、特定のケースでは、「CMD」を追加することによって、それらを区別しています。 私はたぶん1つ以上のソケットを作成するかもしれませんが、それぞれが再度ログインする必要があります。パスワードはSHA-512で暗号化されていますが、安全な方法で保存することができますが、どこかにパスワードが掛かっているとは思いません。 – Lolmewn

+0

なぜ別のログインがあるのか​​わかりません。サーバー上に別のリスニングソケットを作成する必要はありません。ソケットを効果的に複製するには、ServerSocketのaccept()メソッドを呼び出してください。 –

+0

accept()を使って新しいソケットを作成したときの最初のことは、ログイン資格情報をチェックしていることです。これは、もちろん、物事を安全に保つためです。 – Lolmewn

関連する問題