- 浏览: 213093 次
- 性别:
- 来自: 哈尔滨
文章分类
最新评论
-
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 2563分布式系统中经常需要协调多进程,多个jvm,或者多台机器之间 ... -
WebService:Axis客户端调用需要身份验证的CXF服务
2012-11-24 12:05 7028CXF服务端代码: 1、web.xml配置 < ... -
使用axis轻松调用Webservice
2012-11-10 13:15 21865使用axis1.4调用webservice有两种简单的方式: ... -
执行java程序时如何引用依赖的jar
2012-11-10 12:38 1753在执行java程序时我们可以通过-Djava.ext.dirs ... -
Log4j简单实用配置
2012-10-27 12:22 3634#A1为控制台输出,A2为文件输出,R为文件输出,并且按 ... -
JavaNIO处理长连接
2012-09-12 21:04 14050之前在IBM的网站上看到过一篇介绍NIO的文章,收获很大。但文 ... -
Int和byte数组之间的转换
2012-08-27 20:25 18752有时候和C的程序通信的时候,我们在封装协议时,可能需要将Jav ... -
用闭锁测试HashMap的并发写入问题
2012-08-27 19:39 3622今天无意中看到以前写 ... -
LDAP查询分页,基于迭代器的查询分页
2012-08-25 17:26 8448LDAP服务器端可以支持分页查询,但是有个前提条件 ... -
并行计算框架的Java实现--系列三
2012-07-14 14:38 4108接上篇并行计算框架的Java实现--系列二 优化锁,之 ... -
并行计算框架的Java实现--系列二
2012-07-14 08:41 2894接上篇并行计算框架的J ... -
并行计算框架的Java实现--系列一
2012-07-14 07:38 3438最近的工作需要统计一些复杂的报表,为了提高效率,想用多线程去实 ... -
ant初探
2012-06-29 13:38 2867前些天和同事交流,他说ant非常好用,他一直在用,学习资料共享 ... -
基于事件的 NIO 多线程服务器
2012-06-27 17:06 1204JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程 ... -
Java NIO学习
2012-06-22 22:46 0端午节加班要开发一个SocketServer,需要承载1000 ... -
httpclient访问https服务,可以信任证书
2012-06-02 00:48 6805private HttpClient initHttpClie ... -
Java或Web工程中查找配置文件
2012-06-02 00:35 1030String path = ""; URL ... -
如何获取真实的终端IP
2011-11-24 11:16 1188在有Apache做负载均衡的时候使用request.getRe ... -
MANIFEST.MF的应用以及如何读取jar包外的log4j.properties
2011-11-22 18:21 34MANIFEST.MF是jar文件的配置文件,在用eclips ... -
很好用的java反编译工具
2011-10-02 16:36 1206可以反编译单个文件,也可以反编译整个jar
相关推荐
java实现Telnet协议的远程服务器连接,运行稳定,性能佳。
NULL 博文链接:https://zrzdemon.iteye.com/blog/1499804
模仿应用Telnet协议,把本地用户所使用的计算机变成远程主机系统的一个终端。 三种主要功能: 1)定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的...
TelnetClient包,TelnetClient类根据RFC 854为Telnet协议实现了简单网络虚拟终端(NVT)。它没有实现任何其他Telnet选项,因为它打算在Java程序中使用,以提供对Telnet可访问资源的自动访问。 可以通过首先使用Socket...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器...
telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你... //增加信息 …… Java实现的点对点短消息发送协议(smpp)开发包源码 70个目标文件,如题。 Java实现的放大...
第6章:简要的介绍了一下TCP/IP协议在Windows和LINUX操作系统下的实现原理TCP/IP协议的二进制代码。 下篇包含以下6章内容: 第7章:介绍了网络程序设计有关的基础知识、一个网络程序入门实例和Winsock中编写网络程序...
例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你... //增加信息 …… Java实现的点对点短消息发送协议(smpp)开发包源码 70个目标文件,如题。 Java实现的放大...
26.4 Telnet协议 302 26.4.1 NVT ASCII 302 26.4.2 Telnet命令 302 26.4.3 选项协商 303 26.4.4 子选项协商 304 26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 ...
这种能力是 通过telnet和snmp协议完成的。 1.2 jsp技术 jsp(java server pages)是由sun micro systems公司倡导、许多公司参与一起建 立的一种动态网页技术标准,jsp技术有点类似asp技术。jsp技术在多个方面...
用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...