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());
}
4

2 に答える 2

3

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

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

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

于 2012-04-11T03:21:18.640 に答える
2

たぶん、InputStreamあなたが作成したときからあなたの中にいくつかの汚い情報がありますSocketin.nextLine();データの呼び出しや破棄など、ユーザー名を要求する前に、またはを呼び出すことによって、データをクリーンアップできますか?ユーザー名を要求するclientinput.skip(clientinput.available());前に、つまり、を作成した直後にこれを実行してみてくださいScanner

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

于 2012-04-11T02:47:44.123 に答える