`
378629846
  • 浏览: 216130 次
  • 性别: 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中实现Telnet协议,可以通过使用Apache Commons Net库来简化开发过程。Apache Commons Net是一个开源的Java类库,提供了多种网络协议的实现,包括Telnet、FTP、NNTP等。 ##...

    使用java实现telnet-client工具分享

    在Java编程环境中,实现telnet-client工具主要是为了进行远程终端通信。Telnet协议是一种网络协议,允许用户通过网络连接到远程主机并执行命令,类似于SSH(Secure Shell)但不提供加密和安全性的保障。Apache ...

    telnet.rar telnet 协议 客户端 源代码 java

    本文将深入探讨telnet协议的工作原理,并重点分析Java实现telnet客户端的源代码,帮助读者深化对网络编程的理解。 一、telnet协议概述 telnet协议是一种基于TCP/IP的应用层协议,其主要功能是提供一个标准的接口,...

    Java语言实现Telnet客户端程序(有界面)

    Java语言实现的Telnet客户端程序是一种能够连接到远程服务器并执行命令或进行交互的工具。在本资源中,开发者提供了一个具有图形用户界面(GUI)的实现,使得用户可以通过直观的界面来操作 Telnet 客户端,而不再...

    java 实现telnet服务器执行脚本

    ### Java实现Telnet服务器执行脚本的关键知识点 在IT领域,远程访问和管理服务器是常见的需求,而Telnet协议提供了一种基于文本的网络通信方式,允许用户从远程客户端连接到服务器并执行命令。Java作为一种广泛应用...

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

    Java 实现模拟 SSH 和 Telnet 登陆,以及发送与接收命令是网络编程中常见的需求,主要应用于自动化测试、远程系统管理或数据交换等场景。在本文中,我们将深入探讨如何利用 Java 实现这一功能。 首先,SSH(Secure ...

    telnetd-2_0.zip_java 2 telnet_java telnet server_java 实现Telnet服务

    在IT行业中,网络通信是至关重要的一个领域,而Telnet协议作为早期的远程登录协议,虽然在安全性上不如SSH,但仍然在某些场景下被广泛使用。本篇将详细讲解如何使用Java实现一个Telnet服务器。 标题“telnetd-2_0....

    java gui 实现 telnet 登录交换机

    总结来说,"Java GUI实现telnet登录交换机"涉及的技术主要包括Java Swing GUI设计、Jsch库的使用、Telnet协议的理解以及基本的网络管理知识。通过这样的程序,网络管理员可以方便地远程管理和配置网络设备,提高工作...

    Java Telnet客户端实例源码

    首先,我们要了解Java中的Socket编程是实现Telnet客户端的基础。Java的`java.net.Socket`类提供了创建TCP连接的能力,而`java.io`包下的输入输出流类则用于数据的传输。在Java Telnet客户端中,我们通常会创建一个...

    简易的telnet操作java.rar_Telnet-JAVA_java telnet_telnet_telnet in jav

    在Java编程语言中,我们可以利用Java Telnet库来实现对Telnet协议的支持。这个“简易的telnet操作java.rar”资源可能包含了一个简单的Java程序示例,用于演示如何进行Telnet操作。 首先,我们来了解一下Java中的...

    telnetd_java-1.0.zip_java telnet_java telnet server_java telnetd

    Java TelnetD库是这个概念的Java实现,它为开发者提供了一个方便的工具,可以将telnet功能集成到Java应用程序中,无需依赖操作系统级别的telnet服务。 该库的核心功能包括: 1. **连接管理**:Java TelnetD能够监听...

    Java开发Client客户端,连接Windows的Telnet服务器,解决了中文乱码问题

    在Java开发过程中,有时我们需要创建一个Client客户端来与远程服务器进行通信,比如通过Telnet协议。Windows系统内置了Telnet服务器,允许用户通过命令行进行远程登录和交互。本文将详细探讨如何使用Java开发这样的...

    Telnet Server Client 最小化Java实现

    3. **实现Telnet协议**: - Telnet协议在TCP/IP协议栈的应用层,定义了客户端和服务器之间交互的格式和命令。尽管在本项目中可能没有完全实现所有Telnet命令,但至少会包含基本的文本传输功能。 - Telnet协议允许...

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

    在武汉理工大学的《计算机网络》课程设计中,学生需要模仿实现Telnet协议,将本地计算机转变为远程主机的终端。具体要求包括: - 分析和设计网络实用程序,以实现Telnet协议的功能。 - 编写算法描述和源代码,并...

    NIO实现telnet

    标题中的“NIO实现telnet”指的是使用Java的非阻塞I/O(New Input/Output,简称NIO)来构建一个telnet服务器。在Java中,NIO是一种替代传统阻塞I/O(BIO)的I/O模型,它提供了更高效的数据传输方式,尤其适合处理...

    apache_net.zip_apache teln_apache telnet_java telnet_java telnet

    在Java中,telnet是一个非常有用的工具,允许开发者通过telnet协议与远程服务器进行交互,进行调试、测试或者管理远程服务。telnet库在Java中的实现使得开发者可以方便地创建telnet客户端或服务器应用程序。 Apache...

    java访问ssh和telnet

    在Java中,可以使用内置的`java.net.Socket`类来实现Telnet连接。首先,创建Socket对象,指定主机名和端口,然后通过`getInputStream()`和`getOutputStream()`读写数据,从而发送命令和接收响应。 3. **Java 实现**...

    Java Telnet客户端实例源码.zip_Java Telnet客户端实例源码_telnet

    这个"Java Telnet客户端实例源码.zip"压缩包包含了一个Java实现的Telnet客户端示例代码,可以帮助开发者理解如何在Java环境中构建一个功能完备的Telnet客户端。 在Java中实现一个Telnet客户端主要涉及以下知识点: ...

    Telnet-Server-Client.rar_Telnet Server Java_java socket telnet_

    本资源"Telnet-Server-Client.rar"包含了一个用Java实现的`Telnet`服务器和客户端,这对于理解网络编程和`Socket`通信具有很高的学习价值。 首先,我们要了解`Java`中的`Socket`编程。`Socket`是网络通信的基础,它...

Global site tag (gtag.js) - Google Analytics