文字列の一部を送信し、それが送信されたデータをエンコードしようとしています。 その部分は正しく動作していますが、なんらかの理由で、エンコードされた文字列全体をソケットに送信しません。の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)の文を使用しないことができることを意味し、これらのソケット上の非同期作業をしています。そうすれば他のデータもそこに存在しないはずです。
私は前に、特定のケースでは、「CMD」を追加することによって、それらを区別しています。 私はたぶん1つ以上のソケットを作成するかもしれませんが、それぞれが再度ログインする必要があります。パスワードはSHA-512で暗号化されていますが、安全な方法で保存することができますが、どこかにパスワードが掛かっているとは思いません。 – Lolmewn
なぜ別のログインがあるのかわかりません。サーバー上に別のリスニングソケットを作成する必要はありません。ソケットを効果的に複製するには、ServerSocketのaccept()メソッドを呼び出してください。 –
accept()を使って新しいソケットを作成したときの最初のことは、ログイン資格情報をチェックしていることです。これは、もちろん、物事を安全に保つためです。 – Lolmewn