java实现的telnet功能到windows为啥输出的是乱码啊?

popobeelyt 2008-11-23 03:32:51
代码如下
package org.metarnet.bmcif.telnet;

import java.io.InputStream;
import java.io.PrintStream;

import org.apache.commons.net.telnet.TelnetClient;
import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
import org.apache.commons.net.telnet.*;
import org.apache.log4j.Logger;

public class TelnetHandler {

private static final Logger logger = Logger.getLogger(TelnetHandler.class);

private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
private String prompt ;
String s;

public void TelnetCmd( String server, String user, String password,String cmd){
try {
// Connect to the specified server
telnet.connect( server, 23 );

logger.info("Login............................");
// Get input and output stream references
in = telnet.getInputStream();
out = new PrintStream( telnet.getOutputStream());

//Login
readUntil( "login: " );
write( user );
readUntil( "assword: " );
write( password );

// Advance to a prompt
prompt = ">";
readUntil( prompt );

//Exec Cmd
sendCmd(cmd);

}catch( Exception e ) {
e.printStackTrace();
logger.info("logon failed",e);
}
}

public String readUntil( String pattern ) {
try {
char lastChar = pattern.charAt( pattern.length() - 1 );
StringBuffer sb = new StringBuffer();
//boolean found = false;
char ch = ( char )in.read();

while( true ) {
System.setProperty("GBK","iso8859-1");
System.out.print( ch );
sb.append( ch );
if( ch == lastChar ) {
if( sb.toString().endsWith( pattern ) ) {
//System.out.print( sb.toString());
return sb.toString();
}
}
ch = ( char )in.read();
}
}catch( Exception e ) {
e.printStackTrace();
}
return null;
}

public void write( String value ) {
try {
out.println( value );
out.flush();
System.out.println( value );
}
catch( Exception e ) {
e.printStackTrace();
}
}

public String sendCmd( String command ) {
try {
prompt = ">";
write( command );
return readUntil( s+prompt );
}catch( Exception e ) {
e.printStackTrace() ;
}
return null;
}

public void disconnect() {
try {
telnet.disconnect();
}catch( Exception e ) {
e.printStackTrace();
}
}

public static void main( String[] args ) {
try {

logger.info("发送命令开始");
TelnetHandler telnet = new TelnetHandler();
telnet.TelnetCmd("*****", "*****", "*****","dir");
logger.info("发送命令结束");
telnet.disconnect();
}catch( Exception e ) {
e.printStackTrace();
}
}

}

输出乱码如下

[1;1H[K[2;1H[K[3;1H[K[4;1H[K[5;1H[K[6;1H[K[7;1H[K[8;1H[K[9;1H[K[10;1H[K[11;1H[K[12;1H[K[13;1H[K[14;1H[K[15;1H[K[16;1H[K[17;1H[K[18;1H[K[19;1H[K[20;1H[K[21;1H[K[22;1H[K[23;1H[K[24;1H[K[25;1H[K[1;1H[1;1H*
...全文
802 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangchong_86 2011-04-04
  • 打赏
  • 举报
回复
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

import org.apache.commons.net.telnet.TelnetClient;

public class TestSocket {
private TelnetClient tc=new TelnetClient("VT220");
private InputStream in=null;
private PrintStream out=null;
public TestSocket(){
try {
tc.connect("192.168.1.5",23);
in=tc.getInputStream();
out=new PrintStream(tc.getOutputStream());
System.out.print(readUtil("login: "));
write("wangchong");

System.out.print(readUtil("Password: "));
write("wangchong");

System.out.print(readUtil("$ "));
} catch (Exception e) {
e.printStackTrace();
}
}
public String readUtil(String str){
try {
StringBuffer sb=new StringBuffer();
while(true){
char c=(char)in.read();
sb.append(c);
if(c==str.charAt(str.length()-1)&&sb.toString().endsWith(str)){
return sb.toString();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void write(String value){
out.println(value);
out.flush();
System.out.println(value);
}
public String executeCommond(String commond){
write(commond);
return readUtil("$ ");
}
public void close(){
try {
tc.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws UnsupportedEncodingException {
TestSocket ts=new TestSocket();
String s=new String(ts.executeCommond("ls").getBytes("iso-8859-1"),"gbk");
System.out.print(s);
System.out.print(ts.executeCommond("ping 127.0.0.1 -c 2"));
ts.close();
}
}
wangchm168 2011-02-24
  • 打赏
  • 举报
回复
谢谢楼上的,但是中文乱码还是没有解决
frankyuJava 2011-01-20
  • 打赏
  • 举报
回复
new TelnetClient("VT220");或许可以。
摘自http://group.gimoo.net/review/159091
【niunang回复于22日04点07分 
最开始new TelnetClient()的时候没有设置参数,如下所示:
private TelnetClient telnet = new TelnetClient();
远程登录AIX、linux、sun 服务器执行脚本返回信息都正常,但远程登录windows执行脚本返回信息是乱码。

后来在new TelnetClient()的时候设置了参数,如下所:
private TelnetClient telnet = new TelnetClient("VT220");
登录Windows 2003 和XP执行脚本返回信息就正常了。

但是Windows 2000还是不行!
是不是TelnetClient不支持2000呀,麻烦大哥们分析分析! 】
popobeelyt 2008-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shenjie1989 的回复:]
感觉应该是编码不同
new InputStreamReader(s.getInputStream())); //出现部分乱码

InputStreamReader这个流中可以获取到输入的编码格式

getEncoding()

打出来看一下。乱码是因为输入数据的编码和你转换成字符串用的编码格式不一致。


[/Quote]
getEncoding() 出来是 GBK
shenjie1989 2008-11-23
  • 打赏
  • 举报
回复
升级升那没长时间,晕
shenjie1989 2008-11-23
  • 打赏
  • 举报
回复
感觉应该是编码不同
new InputStreamReader(s.getInputStream())); //出现部分乱码

InputStreamReader这个流中可以获取到输入的编码格式

getEncoding()

打出来看一下。乱码是因为输入数据的编码和你转换成字符串用的编码格式不一致。

popobeelyt 2008-11-23
  • 打赏
  • 举报
回复
顶上去啊~~
popobeelyt 2008-11-23
  • 打赏
  • 举报
回复
一楼的大大能说详细点么~~
Successman2013 2008-11-23
  • 打赏
  • 举报
回复
关注中!!!
kokobox 2008-11-23
  • 打赏
  • 举报
回复
把输入输出流都转为UTF-8 的

所有编码都转为UTF-8 看看

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧