2011-05-15 84 views
1

我有這樣的代碼在主類:的InputStream,OutputStream的一個文件

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

這工作得非常好,因爲System.in從用戶的System.out河畔獲取輸入打印所有輸出。

我試圖改變這一點,所以不是System.in可能是另一個InputStream對象,它每次從文件讀取一行請求輸入,並且System.out也可以是一個Object,它寫入所有輸出到一個文件。

的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) 
    { 
    } 
} 
+5

你的問題是什麼? – squawknull 2011-05-15 02:34:41

回答

1

對於替代的System.out,只需使用一個FileOutputStream。可以使用FileInputStream替代System.in。這不會一次提供輸入,但我期望遠程telnet服務器可以處理提前輸入,所以這應該不重要。

如果提前輸入確實是問題,那麼您遇到了一個難題。您的telnet客戶端的輸入端必須與輸出端同步,並等待遠程服務器/外殼在發送之前預期下一行。

  • IOUtil.readWrite方法(寫)不這樣做。
  • 這樣做需要輸出端注意命令提示符(或其他東西),並告訴輸入端寫入下一行輸入。這是棘手的...脆弱的原因如下:
    • 你不知道命令提示符是什麼樣的。
    • 其中一個命令可以即時更改命令提示符。
    • 命令輸出可能看起來像一個shell命令提示符。

我在telnet協議簡單的介紹一下,我什麼也看不見,指出該客戶端必須同時發送數據線。

+0

我推斷,訣竅是他想要逐字節地解析它,但不能因爲流打開。 – Thufir 2013-08-31 03:19:16

+0

@Thufir - 我不明白你想說什麼。你在說什麼流?這個問題沒有提到由於輸入文件被鎖定而拋出的IOException異常...... – 2013-08-31 07:09:31

+0

它只是一個推論。這不是IOException。 Apache示例代碼將獲得用戶輸入並通過telnet發送。它也會迴應telnet服務器響應的內容。在這方面它模擬了telnet。但是,它不提供與遠程服務器發送的實際InputStream的接口。我推斷這是他所問的未說明的問題,但我可能是錯的。這是來自http://svn.apache.org/repos/asf/commons/proper/net/trunk/src/main/java/examples/util/IOUtil.java的示例代碼,它不*允許您訪問運行時的InputStream。 – Thufir 2013-08-31 07:13:21

相關問題