- 浏览: 215754 次
- 性别:
- 来自: 哈尔滨
文章分类
最新评论
-
lizhenzhendebishe:
提示An error was discovered proce ...
WebService:Axis客户端调用需要身份验证的CXF服务 -
yuanliangding:
学习了。不太接触底层的东西
UNIX系统的IO模型 -
_copythat:
加油,。。。
阳光总会在风雨之后洒向苍茫 -
donlianli:
莫非去淘宝菜鸟网络了?
阳光总会在风雨之后洒向苍茫 -
菜鸟小于:
我也是哈尔滨的,在广州做了三年的开发,可是实际上我们是在维护一 ...
阳光总会在风雨之后洒向苍茫
package telnet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* Telnet简单实现
*
* @author xueliang 2010.11.6
*
*/
public class Telnet {
private static final byte SB = (byte) 250;// 子选项开始
private static final byte SE = (byte) 240;// 子选项结束
private static final byte WILL = (byte) 251;// 选项协商
private static final byte WONT = (byte) 252;// 选项协商
private static final byte DO = (byte) 253;// 选项协商
private static final byte DONT = (byte) 254;// 选项协商
private static final byte IAC = (byte) 255;// 数据字节255
private static final byte ECHO = (byte) 1;// 回显
private static final byte IS = (byte) 0;// 是
private static final byte SUPPRESS = (byte) 3;// 抑制继续进行
private static final byte TT = (byte) 24;// 终端类型
private InputStream is;
private OutputStream os;
private Socket client;
private byte[] readBuffer = new byte[1024];
/**
* 打开telnet连接
* @param ip
* @param port 23
* @return
* @throws CmdException
*/
public Telnet(String ip){
this(ip, 23);
}
/**
* 打开telnet连接
* @param ip
* @param port
* @return
* @throws CmdException
*/
public Telnet(String ip, int port){
try {
client = new Socket(ip, port);
client.setSoTimeout(5000);//设置is的read方法阻塞时间为5秒
is = client.getInputStream();
os = client.getOutputStream();
} catch (Exception e) {
this.close();
}
}
/**
* 读取回显,并进行telnet协商
* @return
* @throws IOException
*/
public String recieveEcho() throws IOException {
int len = is.read(this.readBuffer);
if(is.available() == 0)
return "";
ArrayList<Byte> bsList = new ArrayList<Byte>();
ArrayList<Byte> cmdList = new ArrayList<Byte>();
for (int i = 0; i < len; i++) {
int b = this.readBuffer[i] & 0xff;//&0xff是为了防止byte的255溢出,java中byte的取值是-128~127
if (b != 255) {
if (b == '\n' || b == '\0') {// NVT中行结束符以'\r\n'表示,回车以'\r\0表示'
continue;
}
bsList.add((byte) b);
continue;
}
cmdList.add(IAC);
switch (this.readBuffer[++i] & 0xff) {
case 251:// 服务器想激活某选项
if ((readBuffer[++i] & 0xff) == 1) {// 同意回显
cmdList.add(DO);
cmdList.add(ECHO);
} else if ((readBuffer[i] & 0xff) == 3) {// 同意抑制继续执行
cmdList.add(DO);
cmdList.add(SUPPRESS);
// cmdList.add(GA);
} else {// 不同意其他类型协商
cmdList.add(DONT);
cmdList.add(readBuffer[i]);
}
break;
case 253:// 服务器想让客户端发起激活某选项
if ((readBuffer[++i] & 0xff) == 24) {// 终端类型
cmdList.add(WONT);// 同意激活终端类型协商
cmdList.add(TT);
} else if ((readBuffer[i] & 0xff) == 1) {
cmdList.add(WILL);
cmdList.add(ECHO);
} else {
cmdList.add(WONT);// 不同意其他类型协商
cmdList.add(readBuffer[i]);
}
break;
case 250:// 子选项开始
cmdList.add(SB);
if ((readBuffer[++i] & 0xff) == 24
&& (readBuffer[++i] & 0xff) == 1) {// 发送你的终端类型
cmdList.add(TT);
cmdList.add(IS);// 我的终端类型是
cmdList.add((byte) 'V');
cmdList.add((byte) 'T');
cmdList.add((byte) '1');
cmdList.add((byte) '0');
cmdList.add((byte) '0');
}
break;
case 240:// 子选项结束
cmdList.add(SE);
break;
case 252:// 必须同意
cmdList.add(DONT);
cmdList.add(readBuffer[++i]);
break;
case 254:// 必须同意
cmdList.add(WONT);
cmdList.add(readBuffer[++i]);
break;
}
}
// 如果有协商则向服务端发送协商选项
if (cmdList.size() > 0) {
byte[] writeBuffer = new byte[cmdList.size()];
for (int i = 0; i < cmdList.size(); i++) {
writeBuffer[i] = cmdList.get(i);
}
os.write(writeBuffer);
}
// 组织回显字符
int size = bsList.size();
String str = "";
if (size > 0) {
byte[] bs = new byte[size];
for (int i = 0; i < size; i++) {
bs[i] = bsList.get(i).byteValue();
}
str = new String(bs, "gbk");
}
// 以下测试时打开
// System.out.print("read===== ");
// for (int i = 0; i < len; i++) {
// System.out.print(readBuffer[i]&0xff);
// System.out.print(" ");
// }
// System.out.println();
// if(cmdList.size()>0){
// System.out.print("write==== ");
// for (int i = 0; i < cmdList.size(); i++) {
// System.out.print(cmdList.get(i) & 0xff);
// System.out.print(" ");
// }
// System.out.println();
// }
return str;
}
/**
* 直接发送命令,不发送回车键
* @param cmd
*/
public void sendWithoutCR(String cmd) {
try {
os.write(cmd.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 命令中不要包括回车、换行
* @param cmd
*/
public void sendCmd(String cmd) {
cmd += "\r\0";
try {
os.write(cmd.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 按字节发送命令,数组中不要包括回车、换行
* @param cmd
*/
public void sendCmd(List<Byte> cmdList) {
if(cmdList == null)return;
int size = cmdList.size();
byte[] send = null;
if(cmdList.get(size-1) == '\r'){
send = new byte[size+1];
send[size] = '\0';
}else{
send = new byte[size];
}
for (int i = 0; i < size; i++) {
send[i] = cmdList.get(i);
}
try {
os.write(send);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 关闭telnet连接
*/
public void close() {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取期望值,使用默认超时时间15秒
* @param keyWords
* @return
*/
public String readKeyWords(String... keyWords){
return this.readKeyWords(15000, keyWords);
}
/**
* 读取期望值
* @param timeOut 超时时间
* @param keyWords
* @return
* @throws CmdException
*/
public String readKeyWords(long timeOut,String... keyWords){
String rv = "";
long nextTime = 0;
long endTime = System.currentTimeMillis() + timeOut;
do {
try{
String _rv = this.recieveEcho();
rv += _rv;
}catch(IOException e){
nextTime = endTime - System.currentTimeMillis() ;
}
} while (!this.findKeyWord(keyWords, rv) && nextTime >= 0);
if(nextTime < 0)
System.err.println("Read TimeOut...Echo:\n"+rv);
return rv;
}
/**
* 查找关键字
* @param keyWords
* @param str
* @return
*/
private boolean findKeyWord(String[] keyWords,String str){
if(keyWords == null || str == null)return false;
for (int i = 0; i < keyWords.length; i++) {
if(str.indexOf(keyWords[i]) != -1)
return true;
}
return false;
}
public static void main(String[] args) {
Telnet telnet = new Telnet("10.110.111.193");
String str = telnet.readKeyWords(":");
System.out.println(str);
telnet.sendCmd("boco");
str = telnet.readKeyWords(":");
telnet.sendCmd("Ab123456");
str = telnet.readKeyWords("$");
System.out.println(str);
telnet.sendCmd("ls");
str = telnet.readKeyWords(10000,"$");
System.out.println(str);
telnet.close();
}
}
发表评论
-
使用zookeeper实现分布式共享锁
2013-04-13 15:59 2603分布式系统中经常需要协调多进程,多个jvm,或者多台机器之间 ... -
WebService:Axis客户端调用需要身份验证的CXF服务
2012-11-24 12:05 7072CXF服务端代码: 1、web.xml配置 < ... -
使用axis轻松调用Webservice
2012-11-10 13:15 21990使用axis1.4调用webservice有两种简单的方式: ... -
执行java程序时如何引用依赖的jar
2012-11-10 12:38 1792在执行java程序时我们可以通过-Djava.ext.dirs ... -
Log4j简单实用配置
2012-10-27 12:22 3673#A1为控制台输出,A2为文件输出,R为文件输出,并且按 ... -
JavaNIO处理长连接
2012-09-12 21:04 14129之前在IBM的网站上看到过一篇介绍NIO的文章,收获很大。但文 ... -
Int和byte数组之间的转换
2012-08-27 20:25 18817有时候和C的程序通信的时候,我们在封装协议时,可能需要将Jav ... -
用闭锁测试HashMap的并发写入问题
2012-08-27 19:39 3664今天无意中看到以前写 ... -
LDAP查询分页,基于迭代器的查询分页
2012-08-25 17:26 8604LDAP服务器端可以支持分页查询,但是有个前提条件 ... -
并行计算框架的Java实现--系列三
2012-07-14 14:38 4165接上篇并行计算框架的Java实现--系列二 优化锁,之 ... -
并行计算框架的Java实现--系列二
2012-07-14 08:41 2937接上篇并行计算框架的J ... -
并行计算框架的Java实现--系列一
2012-07-14 07:38 3508最近的工作需要统计一些复杂的报表,为了提高效率,想用多线程去实 ... -
ant初探
2012-06-29 13:38 2915前些天和同事交流,他说ant非常好用,他一直在用,学习资料共享 ... -
基于事件的 NIO 多线程服务器
2012-06-27 17:06 1275JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程 ... -
Java NIO学习
2012-06-22 22:46 0端午节加班要开发一个SocketServer,需要承载1000 ... -
httpclient访问https服务,可以信任证书
2012-06-02 00:48 6854private HttpClient initHttpClie ... -
Java或Web工程中查找配置文件
2012-06-02 00:35 1070String path = ""; URL ... -
如何获取真实的终端IP
2011-11-24 11:16 1220在有Apache做负载均衡的时候使用request.getRe ... -
MANIFEST.MF的应用以及如何读取jar包外的log4j.properties
2011-11-22 18:21 34MANIFEST.MF是jar文件的配置文件,在用eclips ... -
很好用的java反编译工具
2011-10-02 16:36 1247可以反编译单个文件,也可以反编译整个jar
相关推荐
#### 三、Java实现Telnet远程连接 在Java中实现Telnet协议,可以通过使用Apache Commons Net库来简化开发过程。Apache Commons Net是一个开源的Java类库,提供了多种网络协议的实现,包括Telnet、FTP、NNTP等。 ##...
在Java编程环境中,实现telnet-client工具主要是为了进行远程终端通信。Telnet协议是一种网络协议,允许用户通过网络连接到远程主机并执行命令,类似于SSH(Secure Shell)但不提供加密和安全性的保障。Apache ...
本文将深入探讨telnet协议的工作原理,并重点分析Java实现telnet客户端的源代码,帮助读者深化对网络编程的理解。 一、telnet协议概述 telnet协议是一种基于TCP/IP的应用层协议,其主要功能是提供一个标准的接口,...
Java语言实现的Telnet客户端程序是一种能够连接到远程服务器并执行命令或进行交互的工具。在本资源中,开发者提供了一个具有图形用户界面(GUI)的实现,使得用户可以通过直观的界面来操作 Telnet 客户端,而不再...
### Java实现Telnet服务器执行脚本的关键知识点 在IT领域,远程访问和管理服务器是常见的需求,而Telnet协议提供了一种基于文本的网络通信方式,允许用户从远程客户端连接到服务器并执行命令。Java作为一种广泛应用...
Java 实现模拟 SSH 和 Telnet 登陆,以及发送与接收命令是网络编程中常见的需求,主要应用于自动化测试、远程系统管理或数据交换等场景。在本文中,我们将深入探讨如何利用 Java 实现这一功能。 首先,SSH(Secure ...
在IT行业中,网络通信是至关重要的一个领域,而Telnet协议作为早期的远程登录协议,虽然在安全性上不如SSH,但仍然在某些场景下被广泛使用。本篇将详细讲解如何使用Java实现一个Telnet服务器。 标题“telnetd-2_0....
总结来说,"Java GUI实现telnet登录交换机"涉及的技术主要包括Java Swing GUI设计、Jsch库的使用、Telnet协议的理解以及基本的网络管理知识。通过这样的程序,网络管理员可以方便地远程管理和配置网络设备,提高工作...
首先,我们要了解Java中的Socket编程是实现Telnet客户端的基础。Java的`java.net.Socket`类提供了创建TCP连接的能力,而`java.io`包下的输入输出流类则用于数据的传输。在Java Telnet客户端中,我们通常会创建一个...
在Java编程语言中,我们可以利用Java Telnet库来实现对Telnet协议的支持。这个“简易的telnet操作java.rar”资源可能包含了一个简单的Java程序示例,用于演示如何进行Telnet操作。 首先,我们来了解一下Java中的...
Java TelnetD库是这个概念的Java实现,它为开发者提供了一个方便的工具,可以将telnet功能集成到Java应用程序中,无需依赖操作系统级别的telnet服务。 该库的核心功能包括: 1. **连接管理**:Java TelnetD能够监听...
在Java开发过程中,有时我们需要创建一个Client客户端来与远程服务器进行通信,比如通过Telnet协议。Windows系统内置了Telnet服务器,允许用户通过命令行进行远程登录和交互。本文将详细探讨如何使用Java开发这样的...
3. **实现Telnet协议**: - Telnet协议在TCP/IP协议栈的应用层,定义了客户端和服务器之间交互的格式和命令。尽管在本项目中可能没有完全实现所有Telnet命令,但至少会包含基本的文本传输功能。 - Telnet协议允许...
在武汉理工大学的《计算机网络》课程设计中,学生需要模仿实现Telnet协议,将本地计算机转变为远程主机的终端。具体要求包括: - 分析和设计网络实用程序,以实现Telnet协议的功能。 - 编写算法描述和源代码,并...
标题中的“NIO实现telnet”指的是使用Java的非阻塞I/O(New Input/Output,简称NIO)来构建一个telnet服务器。在Java中,NIO是一种替代传统阻塞I/O(BIO)的I/O模型,它提供了更高效的数据传输方式,尤其适合处理...
在Java中,telnet是一个非常有用的工具,允许开发者通过telnet协议与远程服务器进行交互,进行调试、测试或者管理远程服务。telnet库在Java中的实现使得开发者可以方便地创建telnet客户端或服务器应用程序。 Apache...
在Java中,可以使用内置的`java.net.Socket`类来实现Telnet连接。首先,创建Socket对象,指定主机名和端口,然后通过`getInputStream()`和`getOutputStream()`读写数据,从而发送命令和接收响应。 3. **Java 实现**...
这个"Java Telnet客户端实例源码.zip"压缩包包含了一个Java实现的Telnet客户端示例代码,可以帮助开发者理解如何在Java环境中构建一个功能完备的Telnet客户端。 在Java中实现一个Telnet客户端主要涉及以下知识点: ...
本资源"Telnet-Server-Client.rar"包含了一个用Java实现的`Telnet`服务器和客户端,这对于理解网络编程和`Socket`通信具有很高的学习价值。 首先,我们要了解`Java`中的`Socket`编程。`Socket`是网络通信的基础,它...