1

メインクラスに次のコードがあります。

IOUtil.readWrite(telnet.getInputStream(), telnet.getOutputStream(),
    System.in, System.out);

System.in はユーザーから入力を取得し、System.out はすべての出力を出力するため、これは非常にうまく機能します。

これを変更しようとしていたので、System.in の代わりに、入力を要求するたびにファイルから 1 行を読み取る別の InputStream オブジェクトにすることができます。また、System.out は、すべての出力をファイルに書き込むオブジェクトにすることもできます。

IOUtil クラスは次のとおりです。

package examples;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.io.Util;

public final class IOUtil
{

public  final static void readWrite(final InputStream remoteInput,
                                   final OutputStream remoteOutput,
                                   final InputStream localInput,
                                   final OutputStream localOutput)
{
    Thread reader, writer;

    reader = new Thread()
             {
                 public void run()
                 {
                     int ch;

                     try
                     {
                         while (!interrupted() && (ch = localInput.read()) != -1)
                         {
                             remoteOutput.write(ch);
                             remoteOutput.flush();
                         }
                     }
                     catch (IOException e)
                     {
                         //e.printStackTrace();
                     }
                 }
             }
             ;

    writer = new Thread()
             {
                 public void run()
                 {
                     try
                     {
                         Util.copyStream(remoteInput, localOutput);                                
                     }
                     catch (IOException e)
                     {
                         e.printStackTrace();
                         System.exit(1);
                     }
                 }
             };


    writer.setPriority(Thread.currentThread().getPriority() + 1);

    writer.start();
    reader.setDaemon(true);
    reader.start();

    try
    {
        writer.join();
        reader.interrupt();
    }
    catch (InterruptedException e)
    {
    }
}
4

1 に答える 1

1

System.out の代わりに、単純にFileOutputStream.

System.in の代わりに、FileInputStream. これは一度に 1 行ずつ入力を提供するわけではありませんが、リモートの telnet サーバーは先行入力を処理できるので、問題にはなりません。

先行入力問題になる場合は、難しい問題があります。telnet クライアントの入力側は出力側と同期し、リモート サーバー/シェルが送信する前に次の行を予期するまで待機する必要があります。

  • メソッドはIOUtil.readWrite(書かれているように)それをしません。
  • これを行うには、出力側がコマンド プロンプト (または何か) に気づき、入力側に次の入力行を書き込むように指示する必要があります。それはトリッキーです...そして次の理由で壊れやすいです:
    • コマンド プロンプトがどのように表示されるかはわかりません。
    • コマンドの 1 つは、その場でコマンド プロンプトを変更できます。
    • コマンド出力は、シェル コマンド プロンプトのようになります。

私は telnet プロトコルを簡単に調べましたが、クライアントが一度に 1 行ずつデータを送信する必要があることを示すものは何も見つかりませんでした。

于 2011-05-15T03:43:17.177 に答える