0

私のマシン(PCのローカル)に接続されているターゲットマシン(* nixベース)があります。このターゲットでいくつかのコマンドを実行したいと思います。

だから、私は同じことを達成するために Java ソケットを使用しています。

socket = new Socket("100.200.400.300", 23, null, 0 );
                         remote            local 

ここで、上記の行の後に -

socket.isConnected() returns true.

今、私はこの Socket オブジェクトの I/O ストリームを持っています。

while((string = bufferedReader.readLine()) != null) {
     outputStream.write(string .getBytes());
     outputStream.flush(); }

ローカル ファイルからコマンドを読み取り、ターゲット マシンで実行するためにソケット オブジェクトに書き込むバッファ付きリーダー。ソケットから読み取るコードの下-

while((myIntVar = is.read()) != -1) {
//Below line prints some junk data ... hash, updaward arrow and spaces and then
// loop hangs to raise a Socket I/O exception.
System.out.println((char) i);
stringBuffer.append((char) i);}

ここで、ソケット接続が既に確立されているので、コマンドを渡すだけで、それらのコマンドは反対側で実行されるはずです(間違っている場合は修正してください)。

しかし、これは機能していません。上で述べたようにジャンク文字が表示されますが、もう 1 つあります。ソケット接続を確立するためにユーザー名とパスワードを渡しません。telnet の場合と同じように渡す必要がありますか (どのように... ? ここで迷子になります)。

そして、情報のために-上記のコードは私が持っているすべてです(他のさまざまなスレッドで言及されているサーバーまたはクライアントコードはありません)。

4

1 に答える 1

1

Telnetは、あなたが持っているようにrawソケットを完全には使用しません。Telnetには、終了行と終了メッセージの特別な方法があります。使用する正しいプロトコルを作成する必要があります。実際には、telnetにはさまざまな実装がいくつかあります。ライブラリを使用する方が簡単な場合があります。

簡単な回避策は、必要な正しいASCII範囲に含まれない文字をフィルタリングすることです。

private static String cleanMessage(String in) {
    StringBuilder sb = new StringBuilder();
    for (Character i : in.toCharArray()) {
        int charInt = i.hashCode();
        if (charInt >= 32 && charInt <= 126) {
            sb.append(i);
        }
    }
    return sb.toString();
}

Apache Commonsライブラリには、Telnet処理の実装があり、ここに例があります

于 2013-02-18T11:03:23.160 に答える