代码如下:
*************************************************************************
package network;import java.net.Socket;
import java.net.InetAddress;
import java.io.*;
import java.nio.ByteBuffer;/**
* Created by IntelliJ IDEA.
* User: franck
* Date: 2007-4-25
* Time: 16:57:07
* To change this template use File | Settings | File Templates.
*/
public class test_telnet extends Thread {
Socket s = null;
BufferedReader reader = null;
InputStream in = null;
OutputStream out = null;
BufferedReader usr = null;
PrintWriter writer = null;
request req = null;
String host = null;
int port; public test_telnet(String host, int port) {
this.host = host;
this.port = port;
} public void run() {
try {
// String host = "bbs.fudan.edu.cn";
// s = new Socket(host, 23);
// String host = "ftp.hjenglish.com";
// s = new Socket(host, 21); s = new Socket(host, port);
String line = "";
String usrReply = "";
//String startStr = "请输入帐号(试用请输入'guest', 注册请输入'new'):"; usr = new BufferedReader(new InputStreamReader(System.in));
reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
writer = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
in = s.getInputStream();
out = s.getOutputStream();
System.out.println(s.toString()); req = new request(in, this);
req.start();
// int totalBinary = -1;
while (true) {
if ((line = usr.readLine().trim()) != null) {
//System.out.print(line);
byte[] binary = (line + "\r\n").getBytes();
// writer.print(line+"\n");
out.write(binary);
out.flush(); if (line.equals("quit"))
break;
} synchronized (this) {
wait(50);
}
} writer.close();
usr.close();
reader.close();
in.close();
out.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
if (args.length == 2) {
String host = args[0];
int port = Integer.parseInt(args[1]);
test_telnet test = new test_telnet(host, port);
test.start();
}
} class request extends Thread {
//BufferedReader br = null;
InputStream rin = null;
test_telnet telnet = null; public request(/*BufferedReader r,*/ InputStream in, test_telnet tt) {
//this.br = r;
this.rin = in;
this.telnet = tt;
} public void run() {
try {
int totalBinary = -1;
String line = "";
InputStreamReader r = new InputStreamReader(in);
while (true) {
if (telnet.s.isClosed()) break;
if ((totalBinary = in.available()) > 0) {
byte[] binary = new byte[totalBinary];
in.read(binary); line = new String(binary,"gb2312");
System.out.print(line);
} synchronized (this) {
wait(20);
}
} } catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}**************************************************************************我启动程序可登陆bbs.fudan.edu.cn,但是我登陆公司的服务器是就只打印出??$这三个字符后就什么反应都没有了,我通过debug调试发现这三个byte分别是[0]=-1 [1]=-3 [2]=36,不知什么原因,但是使用dos telnet上去就不会出现这些问题,屏幕会直接提示要求输入用户名和密码,这是什么原因?请大家指导。
*************************************************************************
package network;import java.net.Socket;
import java.net.InetAddress;
import java.io.*;
import java.nio.ByteBuffer;/**
* Created by IntelliJ IDEA.
* User: franck
* Date: 2007-4-25
* Time: 16:57:07
* To change this template use File | Settings | File Templates.
*/
public class test_telnet extends Thread {
Socket s = null;
BufferedReader reader = null;
InputStream in = null;
OutputStream out = null;
BufferedReader usr = null;
PrintWriter writer = null;
request req = null;
String host = null;
int port; public test_telnet(String host, int port) {
this.host = host;
this.port = port;
} public void run() {
try {
// String host = "bbs.fudan.edu.cn";
// s = new Socket(host, 23);
// String host = "ftp.hjenglish.com";
// s = new Socket(host, 21); s = new Socket(host, port);
String line = "";
String usrReply = "";
//String startStr = "请输入帐号(试用请输入'guest', 注册请输入'new'):"; usr = new BufferedReader(new InputStreamReader(System.in));
reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
writer = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
in = s.getInputStream();
out = s.getOutputStream();
System.out.println(s.toString()); req = new request(in, this);
req.start();
// int totalBinary = -1;
while (true) {
if ((line = usr.readLine().trim()) != null) {
//System.out.print(line);
byte[] binary = (line + "\r\n").getBytes();
// writer.print(line+"\n");
out.write(binary);
out.flush(); if (line.equals("quit"))
break;
} synchronized (this) {
wait(50);
}
} writer.close();
usr.close();
reader.close();
in.close();
out.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
if (args.length == 2) {
String host = args[0];
int port = Integer.parseInt(args[1]);
test_telnet test = new test_telnet(host, port);
test.start();
}
} class request extends Thread {
//BufferedReader br = null;
InputStream rin = null;
test_telnet telnet = null; public request(/*BufferedReader r,*/ InputStream in, test_telnet tt) {
//this.br = r;
this.rin = in;
this.telnet = tt;
} public void run() {
try {
int totalBinary = -1;
String line = "";
InputStreamReader r = new InputStreamReader(in);
while (true) {
if (telnet.s.isClosed()) break;
if ((totalBinary = in.available()) > 0) {
byte[] binary = new byte[totalBinary];
in.read(binary); line = new String(binary,"gb2312");
System.out.print(line);
} synchronized (this) {
wait(20);
}
} } catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}**************************************************************************我启动程序可登陆bbs.fudan.edu.cn,但是我登陆公司的服务器是就只打印出??$这三个字符后就什么反应都没有了,我通过debug调试发现这三个byte分别是[0]=-1 [1]=-3 [2]=36,不知什么原因,但是使用dos telnet上去就不会出现这些问题,屏幕会直接提示要求输入用户名和密码,这是什么原因?请大家指导。
请参照RFC 854
最好用int 型读入 InputStream
int ch=s.getInputStream().read();
得到0-255之间的整数与协议命令对照
因为byte是不可以转换成int型的,而且也协议参照时也不直观就你返回的值来说:
-1就是int 的255 即协议中的IAC
协议命令开始的标志
每个协议协商命令的开始必须有这个具体的请参照协议范本。
因为字节型为2进制补码运算换算过来
你的收到的值应为:255,253,36
翻译成协议语言:
IAC DO OLD_ENVIRONMENT_VARIABLES
即:
服务器希望你按照旧的环境变量执行交互
不是太重要的