【问题标题】:Java Telnet LibraryJava Telnet 库
【发布时间】:2011-08-24 16:29:16
【问题描述】:

我真的不清楚解释这个要求,但我需要的基本上是一个 JSP 页面,它连接到 Unix 服务器并获取文件的字数并显示在 JSP 页面上。我在这里查看了各种问题,但没有任何帮助。示例代码会有很大帮助。谢谢

【问题讨论】:

    标签: java jsp unix telnet


    【解决方案1】:

    Kavin,我想你现在一定已经找到了其他解决方案或继续前进。但是,我刚刚遇到一个要求,导致我访问了此页面。

    我浏览了这个页面上的一些有点脏的回复和许多其他的,但根本找不到一个简单易用的 Telnet 客户端。

    我花了一点时间在 Commons Net 的解决方案之上编写了一个简单的客户端。请原谅代码中的 System.out 和 System.err,我让它勉强工作。

    public static void main(String[] args) throws Exception {
        SimpleTelnetClient client = new SimpleTelnetClient("localhost", 2323);
        client.connect();
    
        String result = client.waitFor("login:");
        System.out.println("Got " + result);
        client.send("username");
        result = client.waitFor("Password:");
        System.out.println("Got " + result);
        client.send("password");
        client.waitFor("#");
        client.send("ls -al");
        result = client.waitFor("#");
        System.out.println("Got " + result);
        client.send("exit");
    }
    

    不确定它是否会对您有所帮助,但也许它可以成为其他人的起点。

    import java.io.InputStream;
    import java.io.PrintStream;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.LinkedBlockingQueue;
    
    import org.apache.commons.net.telnet.EchoOptionHandler;
    import org.apache.commons.net.telnet.InvalidTelnetOptionException;
    import org.apache.commons.net.telnet.SuppressGAOptionHandler;
    import org.apache.commons.net.telnet.TelnetClient;
    import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
    
    public class SimpleTelnetClient {
        static class Responder extends Thread {
            private StringBuilder builder = new StringBuilder();
            private final SimpleTelnetClient checker;
            private CountDownLatch latch;
            private String waitFor = null;
            private boolean isKeepRunning = true;
    
            Responder(SimpleTelnetClient checker) {
                this.checker = checker;
            }
    
            boolean foundWaitFor(String waitFor) {
                return builder.toString().contains(waitFor);
            }
    
            public synchronized String getAndClearBuffer() {
                String result = builder.toString();
                builder = new StringBuilder();
                return result;
            }
    
            @Override
            public void run() {
                while (isKeepRunning) {
                    String s;
    
                    try {
                        s = checker.messageQueue.take();
                    } catch (InterruptedException e) {
                        break;
                    }
    
                    synchronized (Responder.class) {
                        builder.append(s);
                    }
    
                    if (waitFor != null && latch != null && foundWaitFor(waitFor)) {
                        latch.countDown();
                    }
                }
            }
    
            public String waitFor(String waitFor) {
                synchronized (Responder.class) {
                    if (foundWaitFor(waitFor)) {
                        return getAndClearBuffer();
                    }
                }
    
                this.waitFor = waitFor;
                latch = new CountDownLatch(1);
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    return null;
                }
    
                String result = null;
                synchronized (Responder.class) {
                    result = builder.toString();
                    builder = new StringBuilder();
                }
    
                return result;
            }
        }
    
        static class TelnetReader extends Thread {
            private final SimpleTelnetClient checker;
            private final TelnetClient tc;
    
            TelnetReader(SimpleTelnetClient checker, TelnetClient tc) {
                this.checker = checker;
                this.tc = tc;
            }
    
            @Override
            public void run() {
                InputStream instr = tc.getInputStream();
    
                try {
                    byte[] buff = new byte[1024];
                    int ret_read = 0;
    
                    do {
                        ret_read = instr.read(buff);
                        if (ret_read > 0) {
                            checker.sendForResponse(new String(buff, 0, ret_read));
                        }
                    } while (ret_read >= 0);
                } catch (Exception e) {
                    System.err.println("Exception while reading socket:" + e.getMessage());
                }
    
                try {
                    tc.disconnect();
                    checker.stop();
                    System.out.println("Disconnected.");
                } catch (Exception e) {
                    System.err.println("Exception while closing telnet:" + e.getMessage());
                }
            }
        }
    
        private String host;
        private BlockingQueue<String> messageQueue = new LinkedBlockingQueue<String>();
        private int port;
        private TelnetReader reader;
        private Responder responder;
        private TelnetClient tc;
    
        public SimpleTelnetClient(String host, int port) {
            this.host = host;
            this.port = port;
        }
    
        protected void stop() {
            responder.isKeepRunning = false;
            responder.interrupt();
        }
    
        public void send(String command) {
            PrintStream ps = new PrintStream(tc.getOutputStream());
            ps.println(command);
            ps.flush();
        }
    
        public void sendForResponse(String s) {
            messageQueue.add(s);
        }
    
        public void connect() throws Exception {
            tc = new TelnetClient();
    
            TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
            EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false);
            SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true);
    
            try {
                tc.addOptionHandler(ttopt);
                tc.addOptionHandler(echoopt);
                tc.addOptionHandler(gaopt);
            } catch (InvalidTelnetOptionException e) {
                System.err.println("Error registering option handlers: " + e.getMessage());
            }
    
            tc.connect(host, port);
            reader = new TelnetReader(this, tc);
            reader.start();
    
            responder = new Responder(this);
            responder.start();
        }
    
        public String waitFor(String s) {
            return responder.waitFor(s);
        }
    }
    

    【讨论】:

    • 非常好的解决方案并且优雅简单。不幸的是,当我尝试在第一个位置发送数据时,我得到了模棱两可的字符。我可以在开始时打包\n 来解决问题,所以我知道它有效。希望有人会发布这样的更新示例
    【解决方案2】:

    您为什么不直接使用开源 telnet 客户端。肯定有几个可供选择。谷歌列出了很多。

    【讨论】:

    • 试过了..我有点新手,所以我无法弄清楚..这就是为什么建议举个例子..无论如何谢谢
    猜你喜欢
    • 2015-01-21
    • 2011-02-12
    • 2011-07-22
    • 2010-09-28
    • 2011-03-29
    • 2011-11-04
    • 2012-03-30
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多