当前位置:   article > 正文

【Java】Java编写Telnet客户端,连接到Windows的Telnet服务器,执行命令和批处理脚本_commons-net-3.3.jar里的telnetclient

commons-net-3.3.jar里的telnetclient

Java编写Telnet客户端,连接到Windows的Telnet服务器,执行命令和批处理脚本,同时解决了中文乱码的问题。

 

源代码和Jar包在这里下载:http://download.csdn.net/detail/kerafan/9327585

引入的Jar包:Apache common-net-3.3.jar

 

 

工具类代码如下:

 

  1. package util.telnet;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.SocketException;
  6. import org.apache.commons.net.telnet.TelnetClient;
  7. /**
  8. * Telnet 客户端,用于连接Windows的Telnet服务器
  9. *
  10. * @author Lijinsheng
  11. *
  12. * @since 2015-12-04
  13. *
  14. */
  15. public class WindowsTelnetClient {
  16. /** Telnet服务器返回的字符集 */
  17. private static final String SRC_CHARSET = "ISO8859-1";
  18. /** 转换后的字符集 */
  19. private static final String DEST_CHARSET = "GBK";
  20. /**
  21. * 终端类型。包括以下类型:VT102、VT100、VT220、WYSE50、WYSE60、XTERM、SCOANSI、ANSI、LINUX、
  22. * VSHELL几种。经测试,对于Windows的Telnet服务器,只有VT100、ANSI类型会造成中文乱码
  23. */
  24. private static final String TERM_TYPE = "VT220";
  25. private TelnetClient client = new TelnetClient(TERM_TYPE);// Telnet客户端
  26. private InputStream input; // Telnet输入流,用于获取Telnet服务器的返回信息
  27. private OutputStream output; // Telnet输出流,用于向服务器发送命令
  28. private String hostname; // IP地址或主机名
  29. private int port = 23; // 端口。默认为23
  30. private String username; // 用户名
  31. private String password; // 密码
  32. private String prompt; // 命令提示符,用于判断是否读取到了返回信息的结尾
  33. /**
  34. * 创建Telnet客户端,用于连接Windows的Telnet服务器。使用默认端口:23
  35. *
  36. * @param hostname
  37. * - IP地址,或主机名
  38. * @param username
  39. * - 用户名
  40. * @param password
  41. * - 密码
  42. */
  43. public WindowsTelnetClient(String hostname, String username, String password) {
  44. this.hostname = hostname;
  45. this.username = username;
  46. this.password = password;
  47. }
  48. /**
  49. * 创建Telnet客户端,用于连接Windows的Telnet服务器
  50. *
  51. * @param hostname
  52. * - IP地址,或主机名
  53. * @param port
  54. * - 端口
  55. * @param username
  56. * - 用户名
  57. * @param password
  58. * - 密码
  59. */
  60. public WindowsTelnetClient(String hostname, int port, String username, String password) {
  61. this.hostname = hostname;
  62. this.port = port;
  63. this.username = username;
  64. this.password = password;
  65. }
  66. /**
  67. * 连接到Telnet服务器
  68. *
  69. * @return - Telnet服务器的返回信息。截止到password:
  70. * @throws SocketException
  71. * @throws IOException
  72. */
  73. public String connect() throws SocketException, IOException {
  74. client.connect(hostname, port);
  75. input = client.getInputStream();
  76. output = client.getOutputStream();
  77. // 因为不知道服务器返回的是Login: 还是 login: ,所以忽略l
  78. String loginOutput = readTo("ogin: ");
  79. output.write((username + "\r\n").getBytes());
  80. output.flush();
  81. // 因为不知道服务器返回的是Password: 还是 password: ,所以忽略p
  82. String passwordOutput = readTo("assword: ");
  83. output.write((password + "\r\n").getBytes());
  84. output.flush();
  85. String promptOutput = readTo(">");
  86. // 取倒数4位字符作为提示符,因为提示符最短为4位,如:C:\>
  87. prompt = promptOutput.substring(promptOutput.length() - 4);
  88. return loginOutput + passwordOutput + password + promptOutput;
  89. }
  90. /**
  91. * 向Telnet服务器发送命令
  92. *
  93. * @param command
  94. * - 命令
  95. * @return - 执行命令后,在命令行输出的信息
  96. * @throws IOException
  97. */
  98. public String sendCommand(String command) throws IOException {
  99. output.write(command.getBytes());
  100. output.write('\r');
  101. output.write('\n');
  102. output.flush();
  103. return readToPrompt();
  104. }
  105. /**
  106. * 断开连接
  107. *
  108. * @return - 断开连接的命令
  109. */
  110. public String disconnect() {
  111. try {
  112. input.close();
  113. output.close();
  114. client.disconnect();
  115. } catch (Exception e) {
  116. }
  117. return "exit";
  118. }
  119. /**
  120. * 读取后指定的字符处
  121. *
  122. * @param end
  123. * - 指定的字符
  124. * @return - 从上次读取的位置,到<code>end</code>位置的输出内容
  125. */
  126. private String readTo(String end) {
  127. StringBuffer sb = new StringBuffer();
  128. char endChar = end.charAt(end.length() - 1);
  129. char chr;
  130. try {
  131. while (true) {
  132. chr = (char) input.read();
  133. sb.append(chr);
  134. if (chr == endChar && sb.toString().endsWith(end)) {
  135. return new String(sb.toString().getBytes(SRC_CHARSET), DEST_CHARSET); // 编码转换,解决中文乱码问题
  136. }
  137. }
  138. } catch (IOException e) {
  139. e.printStackTrace();
  140. }
  141. return "";
  142. }
  143. /**
  144. * 读取后命令提示符
  145. *
  146. * @return - 从上次读取的位置,到命令提示符的输出内容
  147. */
  148. private String readToPrompt() {
  149. return readTo(prompt);
  150. }
  151. }

 

 

 

测试类的代码如下:

 

  1. package util.telnet;
  2. public class ClientTest {
  3. public static void main(String[] args) throws Exception {
  4. String hostname = "localhost"; // or:127.0.0.1
  5. int port = 23;
  6. String username = "Lijinsheng";
  7. String password = "abc123";
  8. WindowsTelnetClient client = new WindowsTelnetClient(hostname, port, username, password);
  9. System.out.print(client.connect());
  10. System.out.print(client.sendCommand("dir")); // 执行windows命令
  11. System.out.print(client.sendCommand("D:\\Temp\\bat\\demo.bat abc123")); // 执行批处理脚本
  12. System.out.print(client.disconnect());
  13. }
  14. }

 

 

 

输出结果如下:

 

  1. Welcome to Microsoft Telnet Service
  2. login: Lijinsheng
  3. password: abc123
  4. *===============================================================
  5. Microsoft Telnet Server.
  6. *===============================================================
  7. C:\Users\Administrator>dir
  8. 驱动器 C 中的卷没有标签。
  9. 卷的序列号是 ACA6-9BB8
  10. C:\Users\Administrator 的目录
  11. 2015-11-22 15:02 <DIR> .
  12. 2015-11-22 15:02 <DIR> ..
  13. 2015-11-29 15:11 <DIR> .android
  14. 2015-08-04 16:14 <DIR> .FontForge
  15. 2015-10-15 19:36 <DIR> .IdeaIC14
  16. 2015-11-22 15:09 <DIR> .idlerc
  17. 2014-10-26 18:02 <DIR> .jmc
  18. 2015-07-07 23:06 <DIR> .julia
  19. 2015-10-28 11:41 <DIR> .kettle
  20. 2015-08-25 10:27 <DIR> .pentaho
  21. 2015-08-25 10:26 <DIR> .swt
  22. 2014-11-08 22:54 <DIR> CMB
  23. 2014-10-22 15:45 <DIR> Contacts
  24. 2015-12-04 17:40 <DIR> Desktop
  25. 2015-11-26 22:33 <DIR> Documents
  26. 2015-02-06 22:12 <DIR> Downloads
  27. 2015-06-23 20:23 <DIR> Favorites
  28. 2015-03-18 11:56 <DIR> Links
  29. 2014-10-22 15:45 <DIR> Music
  30. 2014-10-29 10:35 <DIR> Oracle
  31. 2014-12-11 12:31 <DIR> Pictures
  32. 2014-10-22 15:45 <DIR> Saved Games
  33. 2014-10-30 22:36 <DIR> Searches
  34. 2015-06-07 20:52 <DIR> Videos
  35. 2015-10-28 15:35 1,151 桌面 - 快捷方式.lnk
  36. 1 个文件 1,151 字节
  37. 24 个目录 88,712,892,416 可用字节
  38. C:\Users\Administrator>D:\Temp\bat\demo.bat abc123
  39. OUT1=abc123
  40. ERROR_CODE=0
  41. ERROR_MSG=SUCCESS..
  42. OUT2=12.345
  43. OUT3=ABC123
  44. OUT4=2015-12-13
  45. C:\Users\Administrator>exit

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/963344
推荐阅读
相关标签
  

闽ICP备14008679号