首先感谢llade的提示其实问题就是一个线程的同步问题。描述:在正常情况下在本程序向telnet服务端发送命令,服务端返回一个结果然后本程序分析该结果是否正确,并确认服务端是否运行上条命力正常结束。我的问题就是原先的程序未得对方运行完毕就一股脑的把所有命令发送过去。这是错误的。改正的方法就是加了一个检测函数来控制当前命令是否正常结束。在此感谢llade的提示。这里本来使用多线程的后经过修改去掉了。现把有问题的程序代码和没问题的代码都贴出来。
有问题:
package tmh.tvs.util.net.telnet;
import org.apache.commons.net.telnet.*;
import java.io.*;
import java.net.SocketException;
import java.util.StringTokenizer;
public class TmhTelnet implements Runnable, TelnetNotificationHandler {
private static TelnetClient tc = null;
private InputStream in;
private PrintStream out;
public static void main(String args[]){
Thread t = new Thread(new TmhTelnet("125.46.86.123",23,"*****","******"));
t.start();
}
public TmhTelnet(String host, int port,String username,String password) {
if(intconnect(host,port)){
write(username);
write(password);
writescript("command.txt");
}
}
private void writescript(String filename) {
try {
if(new File(filename).exists()){
FileReader f = new FileReader(filename);
BufferedReader reader = new BufferedReader(f);
String command = "";
while(command !=null){
command = reader.readLine();
write(command);
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void write(String command) {
try{
System.out.println("command:>>>>>>>>>"+command);
out.println(command);
out.flush();
}catch(Exception e){
e.printStackTrace();
}
}
private boolean intconnect(String host, int port) {
try {
tc = new TelnetClient();
TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(
"VT100", false, false, true, false);
EchoOptionHandler echoopt = new EchoOptionHandler(true, false,
true, false);
SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true,
true, true, true);
tc.addOptionHandler(ttopt);
tc.addOptionHandler(echoopt);
tc.addOptionHandler(gaopt);
tc.connect(host, port);
in = tc.getInputStream();
out = new PrintStream(tc.getOutputStream());
return true;
} catch (Exception e) {
e.printStackTrace();
try {
tc.disconnect();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return false;
}
}
public void receivedNegotiation(int negotiation_code, int option_code) {
String command = null;
if (negotiation_code == TelnetNotificationHandler.RECEIVED_DO) {
command = "DO";
} else if (negotiation_code == TelnetNotificationHandler.RECEIVED_DONT) {
command = "DONT";
} else if (negotiation_code == TelnetNotificationHandler.RECEIVED_WILL) {
command = "WILL";
} else if (negotiation_code == TelnetNotificationHandler.RECEIVED_WONT) {
command = "WONT";
}
System.out.println("Received " + command + " for option code "
+ option_code);
}
/***************************************************************************
* Reader thread. Reads lines from the TelnetClient and echoes them on the
* screen.
**************************************************************************/
public void run() {
InputStream instr = tc.getInputStream();
try {
byte[] buff = new byte[1024];
int ret_read = 0;
do {
ret_read = instr.read(buff);
if (ret_read > 0) {
System.out.print(new String(buff, 0, ret_read));
}
} while (ret_read >= 0);
} catch (Exception e) {
System.err.println("Exception while reading socket:"
+ e.getMessage());
}
try {
tc.disconnect();
} catch (Exception e) {
System.err.println("Exception while closing telnet:"
+ e.getMessage());
}
}
}
可以正常实现功能的代码
package tmh.tvs.util.net.telnet;
import org.apache.commons.net.telnet.*;
import java.io.*;
public class TmhTelnet {
private static TelnetClient tc = null;
private InputStream in;
private PrintStream out;
public static void main(String args[]){
new TmhTelnet("125.46.86.123",23,"***","***");
}
public TmhTelnet(String host, int port,String username,String password) {
byte [] a = new byte[1024];
if(intconnect(host,port)){
writescript("command.txt");
closeconnect();
}
}
private void writescript(String filename) {
try {
if(new File(filename).exists()){
FileReader f = new FileReader(filename);
BufferedReader reader = new BufferedReader(f);
String command = "";
while(command !=null){
command = reader.readLine();
write(command);
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void write(String command) {
try{
System.out.println("command:>>>>>>>>>"+command);
out.println(command);
out.flush();
printresponse();
//for(int i=0;i<800000000;i++);
//应该使用线程同步使程序在接受到对方相应后再执行下一条命令这里使用for循环来模拟对方的相应时间
}catch(Exception e){
e.printStackTrace();
}
}
private boolean intconnect(String host, int port) {
try {
tc = new TelnetClient();
TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(
"VT100", false, false, true, false);
EchoOptionHandler echoopt = new EchoOptionHandler(true, false,
true, false);
SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true,
true, true, true);
tc.addOptionHandler(ttopt);
tc.addOptionHandler(echoopt);
tc.addOptionHandler(gaopt);
tc.connect(host, port);
in = tc.getInputStream();
out = new PrintStream(tc.getOutputStream());
return true;
} catch (Exception e) {
e.printStackTrace();
try {
tc.disconnect();
in.close();
out.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return false;
}
}
private void closeconnect(){
try {
tc.disconnect();
in.close();
//out.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
private String printresponse(){
try {
byte[] buff = new byte[1024];
int ret_read = 0;
do {
ret_read = in.read(buff);
String a = new String(buff, 0, ret_read);
if (a.endsWith(":")|a.endsWith(">")|a.endsWith("]")) {
System.out.print(a);
return null;
}
} while (ret_read >= 0);
} catch (Exception e) {
System.err.println("Exception while reading socket:"
+ e.getMessage());
}
try {
tc.disconnect();
} catch (Exception e) {
System.err.println("Exception while closing telnet:"
+ e.getMessage());
}
return null;
}
}
另外感谢抓包工具,是他让我彻底明白了问题的实质,抓包工具真伟大。
分享到:
相关推荐
5. **断开连接**:当用户完成远程操作,客户端会发送一个断开连接的信号,然后关闭套接字。 在初学者学习telnet源代码时,有几个关键知识点不容忽视: - **网络编程基础**:理解TCP/IP协议栈,包括IP、TCP和应用层...
"解决telnet不是内部命令问题" ...我们首先讨论了问题的原因,然后提供了三个解决方法:安装telnet客户端、启用telnet服务和添加telnet到系统路径。通过这些步骤,我们可以轻松地解决telnet不是内部命令的问题。
本篇文章将深入探讨如何使用C#编写一个 Telnet 客户端程序,并基于提供的源码进行分析。 首先,我们需要了解 Telnet 协议的基本原理。Telnet 协议工作在TCP/IP的会话层,通过开放的23号端口进行通信。它允许用户在...
本主题主要围绕一个使用VB(Visual Basic)编程语言,仅通过Winsock控件实现的简单Telnet程序进行深入探讨。 Winsock控件是VB中用于网络编程的基础组件,它封装了Windows Socket接口,使得开发者无需深入了解底层...
Telnet终端源程序 Telnet终端源程序 Telnet终端源程序
本文将对一个简化的Telnet客户端程序源码进行解析,该程序主要实现了通过代码打开网关、获取节点及其相关信息的功能。 #### 二、源码概览 给定的源码片段是基于C#语言的一个Telnet客户端实现。主要关注的是`...
在VC++中实现一个Telnet程序,主要涉及到以下几个关键概念和技术: 1. **Socket编程**:Socket是网络通信的基础,它是进程间通信的一种方式,特别是在不同主机之间。在VC++中,通常使用Winsock库来实现Socket接口。...
根据提供的文件名列表,我们可以推测这是一个Windows平台下的telnet客户端程序实现,其中包含以下关键组件: 1. **CTelnetView.h** 和 **CTelnetView.cpp**:这些文件可能包含了telnet视图类的定义和实现,它是用户...
今天为了搞一个自动更新程序,找了一些telnet自动登入的程序,自己写了一个类似的ftp自动登入的脚本程序。不敢独吞,与大家共享,这些脚本也可作BBS养马甲之用。 一。Windows平台: 复制一下代码到记事本中并另保存...
telnet端口程序,可以实现服务器与客户端的信息传输
然后按回车,你会看到一个新的提示。 6. 正常输入:现在,你可以在telnet会话中正常输入请求行信息了,比如SSH登录命令或者其他你需要执行的命令,输入完成后按回车执行。 如果以上方法仍然无法解决问题,可能需要...
Linux C telnet程序实例,手把手写LINUX下的telnet程序。
5. **WinTelnet**:这可能是一个Windows平台下的telnet客户端程序,可能提供了额外的功能或改进的用户体验。 6. **安全问题**:telnet通信通常是明文传输的,这意味着数据(包括用户名和密码)可能会被嗅探。因此,...
在这个场景中,提到的"MFC单文档的telnet数据采集程序"是一个利用MFC框架设计的应用,其主要功能是通过telnet协议进行数据采集。 首先,让我们详细了解一下MFC SDI。SDI是一种用户界面模式,其中每个文档都有自己的...
综上所述,这个项目是一个用Visual C++编写的 Telnet 客户端应用程序,包含各种源代码文件和一个可执行文件。通过这个程序,用户可以连接到支持Telnet的服务器,进行远程管理和控制。源代码文件分别处理不同的功能...
【标题】"Telnet服务器端源程序" 是一个基于Delphi编程环境开发的网络通信工具,主要用于实现远程终端服务。Delphi是一种强大的面向对象的编程语言,它以其高效的编译器和直观的集成开发环境(IDE)而闻名,是开发...
这是一个telnet终端和服务器制作程序资料,可以使用该资料。
至于压缩包子文件的文件名,"telvt100.CAB"可能是一个包含程序组件的 cabinet 文件,这是一种Microsoft开发的压缩格式,通常用于软件安装包。"setup.exe"是典型的安装程序文件,用于在用户的计算机上安装该telnet...
在标题和描述中提到的“macOS 10.13 telnet安装 telnet.zip”是一个解决办法,它提供了telnet客户端的可执行文件。这个压缩包(telnet.zip)包含了一个名为“telnet”的文件,这可能是经过编译好的telnet客户端程序...
在Java开发过程中,有时我们需要创建一个Client客户端来与远程服务器进行通信,比如通过Telnet协议。Windows系统内置了Telnet服务器,允许用户通过命令行进行远程登录和交互。本文将详细探讨如何使用Java开发这样的...