import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Telnet {
Socket serverSocket; // 连接用socket
public OutputStream serverOutput; // 用于网络输出的流
public BufferedInputStream serverInput; // 用于网络输入的流
String host; // 连接服务器的地址
int port; // 连接服务器的端口号
static final int DEFAULT_TELNET_PORT = 23; // telnet的端口号(23号)
// 构造器(1):指定地址和端口号时用
public Telnet(String host, int port) {
this.host = host;
this.port = port;
}
// 构造器(2)只指定地址时用
public Telnet(String host) {
this(host, DEFAULT_TELNET_PORT); // 假定为Telnet端口
}
// openConnection 方法
// 由地址和端口号虽构成Socket而开成流
public void openConnection() throws IOException, UnknownHostException {
serverSocket = new Socket(host, port);
serverOutput = serverSocket.getOutputStream();
serverInput = new BufferedInputStream(serverSocket.getInputStream());
// 若连接的是Telnet端口则进行协商
if (port == DEFAULT_TELNET_PORT) {
negotiation(serverInput, serverOutput);
}
}
// main_proc方法
// 启动进行网络处理的线程
public void main_proc() throws IOException {
try {
// 生成线程用streamConnector类的对象
StreamConnector stdin_to_socket = new StreamConnector(System.in,
serverOutput);
StreamConnector socket_to_stdout = new StreamConnector(serverInput,
System.out);
// 生成线程
Thread input_thread = new Thread(stdin_to_socket);
Thread output_thread = new Thread(socket_to_stdout);
// 启动线程
input_thread.start();
output_thread.start();
} catch (Exception e) {
System.err.print(e);
System.exit(1);
}
}
// 定义用于协商的命令
static final byte IAC = (byte) 255;
static final byte DONT = (byte) 254;
static final byte DO = (byte) 253;
static final byte WONT = (byte) 252;
static final byte WILL = (byte) 251;
// negotiation 方法
// 利用NVT进行协商通信
static void negotiation(BufferedInputStream in, OutputStream out)
throws IOException {
byte[] buff = new byte[3]; // 接收命令的数组
while (true) {
in.mark(buff.length);
if (in.available() >= buff.length) {
in.read(buff);
if (buff[0] != IAC) { // 协商结束
in.reset();
return;
} else if (buff[1] == DO) { // 对于DO命令......
buff[1] = WONT; // 用WONT作为应答
out.write(buff);
}
}
}
}
// main方法
// 建立TCP连接,开始处理
public static void main(String[] arg) {
try {
Telnet t = null;
// 由参数个数决定调用哪个构造器
// switch (arg.length) {
// case 1: //只指定服务器地址
// t = new Telnet(arg[0]);
// break;
// case 2: //指定地址和端口
// t = new Telnet(arg[0], Integer.parseInt(arg[1]));
// break;
// default: //使用方法不正确时
// System.out.println(
// "usage:java Telnet <host name> { <port number> } ");
// return;
// }
t = new Telnet("222.211.88.185", 23);
t.openConnection();
t.main_proc();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
// StreamConnector类
// 接收流参数以二者结合实现数据传递
// StreamConnector类是用于构造线程序的类
class StreamConnector implements Runnable {
InputStream src = null;
OutputStream dist = null;
// 构造器 接收输入输出流
public StreamConnector(InputStream in, OutputStream out) {
src = in;
dist = out;
}
// 执行处理的函数体
// 无限循环进行流的读写
public void run() {
byte[] buff = new byte[1024];
while (true) {
try {
int n = src.read(buff);
if (n > 0) {
dist.write(buff, 0, n);
}
} catch (Exception e) {
e.printStackTrace();
System.err.print(e);
System.exit(1);
}
}
}
}
分享到:
相关推荐
实现telnet协议的原理,实现telnet的协议提供系统框架
java实现Telnet协议的远程服务器连接,运行稳定,性能佳。
主要介绍了使用java实现telnet-client工具,需要的朋友可以参考下
telnet.rar telnet 协议 客户端 源代码 java
java gui 实现telnet登录交换机
简易的telnet操作java.rar
本资源使用Java实现Telnet客户端程序,程序有界面,并且资源中简单的写了使用说明,希望能帮到大家
NULL 博文链接:https://zrzdemon.iteye.com/blog/1499804
java 实现telnet服务器执行脚本
C语言实现的telnet客户端 选项协商:所有的选项协商都是服务器主动提出的,客户机不主动发送协商命令,只是对选项协商进行应答,对于回显、抑制继续进行、终端类型是要处理的,其他的否定。 子选项协商只发送终端...
网上下的,和大家分享一下~~用Socket编程来实现Telnet协议
java源代码,通过telnet方式连接服务器,可以设置是否记录日志等信息。经过稍微改动可以实现类似crt软件的功能。
网络协议分析文档教程-【TELNET 协议分析】.pdf
用Java实现telnet到另一台UNIX机器
做telnet协议的,可以参考
java telnet 服务器实现 .
根据Telnet协议,通过C#用套接字编程实现Telnet。
易语言telnet协议登入源码,telnet协议登入,Print,B_T,校验奇偶,B_Hex,Hex_B
C++实现telnet代码,用C++写的telnet