0

一个简单的MUD 客户端项目中的并发和流读取被证明有点让人头疼,所以我试图找到一个替代方案。tee 命令看起来符合在文件和终端之间同时拆分输出的要求。然后如何通过 telnet 会话发送消息?

在控制台和文件之间拆分远程输出:

thufir@dur:~/NetBeansProjects/TelnetConsole$ 
thufir@dur:~/NetBeansProjects/TelnetConsole$ telnet rainmaker.wunderground.com 3000 | tee out.txt
Trying 38.102.137.140...
Connected to rainmaker.wunderground.com.
Escape character is '^]'.
------------------------------------------------------------------------------
*               Welcome to THE WEATHER UNDERGROUND telnet service!            *

然后我如何通过管道或以某种方式将 Java 消息发送到系统 telnet 客户端?exec或者,也许,从 Java中使用和启动 telnet 会话和 tee 会更有意义吗?只是在寻找一个好的方法。

4

2 回答 2

1

是的,exec 听起来像是一个更好的解决方案,因为您想同时控制输入和输出数据。当你使用 exec 时你真的需要 tee in,我不明白为什么......

另请查看 netcat 而不是 telnet - telnet 有一些特殊的字符处理,如果您打算发送二进制数据,可能会给您带来麻烦。

于 2013-09-05T06:58:10.877 回答
0

绝不是功能代码,但绝对比使用 Apache TelnetClient 更简单。但是,不能将管道命令(?)与 java exec 一起使用:

package exec;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

class Ideone {

    public static void main(String[] args) throws IOException {
        new Ideone().start();
    }

    public void start() throws IOException {
        String[] s = new String[6];
        s[0] = "telnet";
        s[1] = "rainmaker.wunderground.com";
        s[2] = "3000";
        s[3] = "|";
        s[4] = "tee";
        s[5] = "out.log";
        for (int i=0;i<s.length;i++ ) {
            System.out.println(s[i]);
        }
        Process process = Runtime.getRuntime().exec(s);
        OutputStream stdin = process.getOutputStream();
        InputStream stderr = process.getErrorStream();
        InputStream stdout = process.getInputStream();
        read();
        write(stdout);
    }

    private void parseLog() {
        //read the log file, automate responses
    }

    private void write(InputStream stdin) throws UnsupportedEncodingException, IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(stdin, "UTF-8"));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

    }

    private void read() {

        Thread read = new Thread() {

            String command = null;

            @Override
            public void run() {
                BufferedReader bufferedInput = new BufferedReader(new InputStreamReader(System.in));
                do {
                    try {
                        command = bufferedInput.readLine();
                    } catch (IOException ex) {
                        System.out.println(ex);
                    } finally {
                    }
                } while (true);
            }
        };
        read.start();
    }
}
于 2013-09-05T08:10:12.120 回答