2012-04-11 16 views
1

私は学校のためにこのプログラムを作った、それはテルネットサーバーを含む。私はそれを実行すると、ÿûÿûのような奇妙な文字を返します。ここで出力されます:奇妙な文字を返すTelnetサーバー

Client connected with the IP /127.0.0.1 
Client /127.0.0.1 has entered the username ÿûÿû ÿûÿû'ÿýÿûÿýdcole. 

マイコード:

Socket client = serv.accept(); 

InetAddress clientip = client.getInetAddress(); 

out("Client connected with the IP " + clientip); 

InputStream clientinput = client.getInputStream(); 
OutputStream clientoutput = client.getOutputStream(); 

Scanner in = new Scanner(clientinput); 
clientoutput.write("Please enter your username: ".getBytes()); 

String username = in.nextLine(); 
out("Client " + clientip + " has entered the username " + username + "."); 

String pass = "Please enter the password for " + username + ": "; 
clientoutput.write(pass.getBytes()); 

String password = in.nextLine(); 

if (username.equals("dcole") && password.equals("test")) { 
    clientoutput.write("\r\nCorrect password!".getBytes()); 
} else { 
    clientoutput.write("\r\nIncorrect password!".getBytes()); 
} 

答えて

2

たぶん、あなたはSocketを作成したときから、あなたのInputStreamでいくつかの汚れた情報があります。 in.nextLine();に電話したり、データを破棄したり、clientinput.skip(clientinput.available());に電話をかけるなど、ユーザー名を尋ねる前にデータを消去することができますか?ユーザー名を尋ねる前に、つまりScannerの作成直後にこれを試してください。

次のように、Telnetサーバーと話しているときは、@StephenCのアドバイスに従うことをお勧めします。Telnet仕様の正しいハンドシェイクとデータ転送プロパティを実装する必要がありますソケットを通して文字列を送る。

+0

1.いいえ、私は窓を使います。 2.いいえ、QWERTYキーボードのキー(英語)のみを使用します。 – cheese5505

+0

また、これは宿題のためではありません:P – cheese5505

+0

上記の私の編集された答えでポイント3を試してみてはいかがですか?ストリームが作成されたときからストリームが汚いかもしれません。 – wattostudios

3

本当の問題は、単に文字データを送受信するソケットサーバーであるかのように、Telnetサーバーを扱っていることです。そんなことはない!

telnetサーバーは、RFC 854RFC 5198でUnicodeをサポートするように更新されました)の説明に従ってtelnetプロトコルを実装しています。メインRFCは、Telnetクライアントまたはサーバーによって送信される多数の特殊シーケンスを指定します。

クライアントが任意のTelnetサーバーに対して適切に動作する場合は、適切にプロトコルを実装する必要があります。 WATTOで提案された回避策はこの場合には有効ですが、この(または別の)テルネットサーバーがこれらの「奇妙な文字」を他の箇所に挿入することがあります。実際、彼らはまったく「奇妙な文字」ではありません。それらはtelnetプロトコルの明確に定義された要素であり、何かを意味します。

+0

私は完全に@StephenCに同意します - それはほぼ確実にテルネットプロトコルの一部です。私はこのユーザーがテルネットサーバーと通信しようとしていたということを見落としたようです。私の反応は、あなたのようなより正確な答えではなく、実際にユーザーが遭遇した問題を「緩和する」試みでした。ユーザーがSocketを使って何をしようとしているのか分かりませんが、Socket経由でStringを送信するのではなく、Telnetプロトコルを正しく実装することを奨励します。 – wattostudios