2011-05-15 82 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

相关问题