java使用telnet连接交换机并管理交换机

像crt或者ssh、甚至是cmd命令中使用window的telnet命令连接交换机。都可以起到控制交换机的作用。
telnet说白了就是一个tcp的长连接。你向交换机输入一组命令,其实就是你使用socket连接上交换机,把你的命令out出去。
如果你想看你执行的命令,返回了什么,你就是用io流直接读取socket中的长连接流中的内容即可。telnet其实就是这么简单。

使用java连接telnet进行操作的注意
1.telnet有VT100 VT52 VT220 VTNT ANSI等协议。
我用vt100。
2.vt100控制码(ansi控制码)过滤的问题,可以过滤,也可以在服务设置不要。
不过滤都是一些乱码。是以\033[***一个字母结尾的格式。
3.中文乱码的问题。
new String(old.getBytes("ISO8859-1"),"GBK")。
4.如何判断读取到最后了。
一有readUntil(),二有使用线程。
5.选择telnet的java包问题,包有很多,比如appache(commons-net-3.0.jar), ganymed(ganymed-ssh2-build210.jar),javaexpect(smart-0.1-SNAPSHOT-jar-with-dependencies.jar)
我使用appache。javaexpect有带的vt100控制码过滤,我没有仔细研究。

6.write要flush()才发送。

看代码吧:

package com.telnet.test;

import java.io.InputStream;
import java.io.PrintStream;

import org.apache.commons.net.telnet.TelnetClient;

import com.telnet.constant.TelnetConstant;

public class TelnetMain {

    private TelnetClient telnet = new TelnetClient("VT100");

    private InputStream in;

    private PrintStream out;

    private static final String DEFAULT_AIX_PROMPT = "#";
    private static final String ENTER_COMMAND_ARROW = ">";
    private static final String ENTER_COMMAND_BRACKETS = "]";
    private static final String ENTER="\n";

    /**
     * telnet 端口
     */
    private String port;

    /**
     * 用户名
     */
    private String user;

    /**
     * 密码
     */
    private String password;

    /**
     * IP 地址
     */
    private String ip;

    public TelnetMain(String ip, String user, String password) {
        this.ip = ip;
        this.port = String.valueOf(23);
        this.user = user;
        this.password = password;
    }

    public TelnetMain(String ip, String port, String user, String password) {
        this.ip = ip;
        this.port = port;
        this.user = user;
        this.password = password;
    }

    /**
     * @return boolean 连接成功返回true,否则返回false
     */
    private boolean connect() {

        boolean isConnect = true;

        try {

            telnet.connect(ip, Integer.parseInt(port));
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
            telnet.setKeepAlive(true);
            write(password);
            String msg=readUntil(ENTER_COMMAND_ARROW);
            System.out.println(msg);
            write("system-view");
            msg=readUntil("\n");
            System.out.println(msg);
            msg=readUntil("\n");
            System.out.println(msg);
            write("display interface ");
            msg=readUntil("\n");
            System.out.println(msg);
            msg=readUntil(ENTER_COMMAND_BRACKETS);
            System.out.println(msg);

        } catch (Exception e) {
            isConnect = false;
            e.printStackTrace();
            return isConnect;
        }
        return isConnect;
    }

    public void su(String user, String password) {
        try {
            write("su" + " - " + user);
            readUntil("Password:");
            write(password);
            readUntil(DEFAULT_AIX_PROMPT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();
            char ch = (char) in.read();
            while (true) {
                //System.out.print(ch);// ---需要注释掉
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                }
                ch = (char) in.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void write(String value) {
        try {
            out.println(value);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(DEFAULT_AIX_PROMPT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private void disconnect() {
        try {
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String getNowDate() {
        this.connect();
        String nowDate = this.sendCommand("date|awk '{print $2,$3,$4}'");
        String[] temp = nowDate.split("\r\n");
        // 去除命令字符串
        if (temp.length > 1) {
            nowDate = temp[0];
        } else {
            nowDate = "";
        }
        this.disconnect();
        return nowDate;
    }

    public static void main(String[] args) {
        try {
        	TelnetMain telnet = new TelnetMain("10.10.2.249", "Huawei", "Huawei");
    		System.setOut(new PrintStream("D:/telnet.txt"));
        	telnet.connect();
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出的内容在telnet.txt文件中,我贴出来给大家看看!

如有疑问,请加qq群:135430763 共同学习!

时间: 2024-12-11 02:02:36

java使用telnet连接交换机并管理交换机的相关文章

Java调用telnet连接到Unix环境的服务器然后再执行perl脚本

问题描述 各位大侠,本人有一个难题,想请教大家,如下:要用Java调用telnet连接到Unix环境的服务器然后再执行perl脚本,并且能够把执行perl脚本的信息返回给前端展示出来.因为本人之前从来没有做过这个所以向大家求救,谢谢!!! 解决方案 解决方案二:不知道但顶一下,闲着无聊解决方案三:方法1.找一个telnet功能的java代码,自然有执行unix命令的方法,也有相应的获取unix回显的方法方法2.有一个类,叫什么我忘了.专门执行命令行命令的,我当时做的时候,是执行windows下的

Java通过JDBC连接SQLServer 2008出现的问题

环境:SQLServer 2008 R2 + MyEclipse 6.5 + JDK 1.6.24 问题:Java通过JDBC连接SQLServer 2008,出现如下问题:java.sql.SQLException: No suitable driver found forjdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=QQ. 解决:检查连接数据库时写的 代码是否有问题. 代码如下: package com.qq.client.db

java基于JDBC连接Oracle 11g Release2实例分析

  本文实例讲述了java基于JDBC连接Oracle 11g Release2的方法.分享给大家供大家参考.具体如下: Oracle 11g Release 2 的 JDBC 连接似乎有所不同 ,如果你收到下面的异常: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

JAVA 网络长短连接

作为java的初学者,看了网上的资料后,关于java的长短连接,感觉理解的不是很深刻,结合自己的学习和网上的资料整理如下,不正确之处请大家批评指正.                   其实作为java语言本身而言,能够提供给我们使用的最终的网络接口实际也就是java的Socket API,除此外别无他物. 所以我们经常提到的HTTP和Netty 长短连接实际都是针对的java Socket而言的,大家都学过网络的7层模型,但是在JAVA中7层模型显的过于的复杂,大多数的层,我们无法直接感知.实

java使用jco连接sap接口

问题描述 java使用jco连接sap接口 java使用jco连接sap接口时,出现 Der Open SQL command is too big 错误,如何解决 解决方案 JAVA使用JCo连接SAP介绍JAVA通过JCO连接SAP例子

java 断开从连接池中获取的连接,规范的操作是怎样的

问题描述 java断开从连接池中获取的连接,规范的操作是怎样的,ResultSet,PreparedStatement,Connection是否需要依次关闭,若需要,应该怎么做才是高效率,规范,而且不会发生内存泄露.涉及到很多try和catch,不知怎么处理. 解决方案 解决方案二:ResultSet,PreparedStatement,Connection是否需要依次关闭需要应该怎么做才是高效率写一个函数用来关闭,如放在的帮助类JdbcUtil里,如publicstaticvoidreleas

java基于odbc连接oracle的实现方法_java

本文实例讲述了java基于odbc连接oracle的实现方法.分享给大家供大家参考,具体如下: 1.加载 oracle驱动 oracle.jdbc.driver.OracleDriver 2.建立到给定数据库 URL 的连接 jdbc:oracle:thin:@localhost:1521:orcl 3.默认的用户名是system,密码是自己设定的,不能用sys或者是sysdba,这个只是角色. public void testOracle() { try { Class.forName("or

java URL建立连接问题

问题描述 java URL建立连接问题 通过 URL url = new URL("Http://172.16.16.16:8080"); 可正常建立连接. 通过 URL url = new URL("Http://172.16.16.16:8080/C:/myDocument/aaaa.ptf"); 会抛出没有该文件的异常,但是该地址下C盘确实有这个文件. 请问是我的地址拼错了吗.或者有其它方法建立与该文件的连接吗. 解决方案 不能这么写,没有办法带上文件名这么用

server-远程服务器Telnet很慢,但是可以Telnet连接上

问题描述 远程服务器Telnet很慢,但是可以Telnet连接上 如题,我的服务器是server2012 的,.远程桌面登陆上去.然后Telnet远在别的机房的一台服务器server 08 .大概10秒钟才连接上,很慢.而从我本地或者从别的服务器Telnet的话就嗖的一下连接上了.请教下大哥哥们,这台服务器怎么了.支个招-- 解决方案 首先检查这台服务器网络连接状态..