`
378629846
  • 浏览: 213093 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

java实现的telnet协议

    博客分类:
  • java
阅读更多

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();

}

}


分享到:
评论

相关推荐

    Telnet的java实现

    java实现Telnet协议的远程服务器连接,运行稳定,性能佳。

    java实现模拟SSH和telnet登陆(实现命令的发送和接受)

    NULL 博文链接:https://zrzdemon.iteye.com/blog/1499804

    Telnet远程登陆的实现-计算机网络课程设计

    模仿应用Telnet协议,把本地用户所使用的计算机变成远程主机系统的一个终端。 三种主要功能: 1)定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的...

    commons-net-2.0.jar TelnetClient包.rar

    TelnetClient包,TelnetClient类根据RFC 854为Telnet协议实现了简单网络虚拟终端(NVT)。它没有实现任何其他Telnet选项,因为它打算在Java程序中使用,以提供对Telnet可访问资源的自动访问。 可以通过首先使用Socket...

    java源码包---java 源码 大量 实例

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    java源码包4

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java源码包3

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java源码包2

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java jdk实列宝典 光盘源代码

    telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; UDP编程,包括收发udp报文; 聊天室服务器端,Chatserver.java;聊天室客户端,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你... //增加信息 …… Java实现的点对点短消息发送协议(smpp)开发包源码 70个目标文件,如题。 Java实现的放大...

    TCP/IP协议与网络编程技术

    第6章:简要的介绍了一下TCP/IP协议在Windows和LINUX操作系统下的实现原理TCP/IP协议的二进制代码。 下篇包含以下6章内容: 第7章:介绍了网络程序设计有关的基础知识、一个网络程序入门实例和Winsock中编写网络程序...

    JAVA上百实例源码以及开源项目源代码 java开源包2

    例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你... //增加信息 …… Java实现的点对点短消息发送协议(smpp)开发包源码 70个目标文件,如题。 Java实现的放大...

    TCP-IP详解卷1:协议

    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 ...

    基于Java的人事管理系统的设计与实现.doc

    这种能力是 通过telnet和snmp协议完成的。 1.2 jsp技术 jsp(java server pages)是由sun micro systems公司倡导、许多公司参与一起建 立的一种动态网页技术标准,jsp技术有点类似asp技术。jsp技术在多个方面...

    Java网络编程(第三版)中文版.part09.rar

    用Telnet研究协议 284 Socket类 286 Socket异常 312 Socket地址 313 示例 314 第十章 服务器socket 332 ServerSocket类 332 一些有用的服务器 349 第十一章 安全Socket 370 保护通信 371 创建安全客户端...

Global site tag (gtag.js) - Google Analytics