📄 telnet.java
字号:
// telnet 僾儘僌儔儉Telnet.java
// 偙偺僾儘僌儔儉偼,巜掕偝傟偨傾僪儗僗偺億乕僩偵昗弨擖弌椡傪愙懕偟傑偡
// 愙懕愭偑telnet 偺億乕僩(23斣)偺応崌,僱僑僔僄乕僔儑儞傪峴偄傑偡
// 僱僑僔僄乕僔儑儞偱偼,僒乕僶偐傜偺梫媮傪偡傋偰抐傝傑偡
// 巊偄曽乮侾乯 java Telnet 僒乕僶傾僪儗僗億乕僩斣崋
// 巊偄曽乮俀乯 java Telnet 僒乕僶傾僪儗僗
// 乮俀乯偺応崌,億乕僩斣崋23斣(telnet)傪壖掕偟傑偡
// 婲摦偺椺java Telnet kiku.fuis.fukui-u.ac.jp
// 廔椆偵偼僐儞僩儘乕儖C 傪擖椡偟偰偔偩偝偄
// 儔僀僽儔儕偺棙梡
import java.net.*;
import java.io.*;
// Telnet僋儔僗
// Telnet僋儔僗偼,僱僢僩儚乕僋愙懕偺娗棟傪峴偄傑偡
// StreamConnector僋儔僗傪梡偄偰僗儗僢僪張棟傪峴偄傑偡
// 僐儞僗僩儔僋僞偼俀庬椶偁傝,巊偄曽偺乮侾乯乮俀乯偵懳墳偟偰偄傑偡
public class Telnet {
Socket serverSocket;//愙懕梡僜働僢僩
public OutputStream serverOutput;//僱僢僩儚乕僋弌椡梡僗僩儕乕儉
public BufferedInputStream serverInput;// 摨擖椡梡僗僩儕乕儉
String host;// 愙懕愭僒乕僶傾僪儗僗
int port; // 愙懕愭僒乕僶億乕僩斣崋
static final int DEFAULT_TELNET_PORT = 23;// telnet 偺億乕僩斣崋(23斣)
// 僐儞僗僩儔僋僞乮侾乯傾僪儗僗偲億乕僩偺巜掕偑偁傞応崌
public Telnet(String host, int port){
this.host = host;
this.port = port;
}
// 僐儞僗僩儔僋僞乮俀乯傾僪儗僗偺巜掕偺傒偺応崌
public Telnet(String host){
this(host, DEFAULT_TELNET_PORT);// telnet 億乕僩傪壖掕
}
// openConnection儊僜僢僪
//傾僪儗僗偲億乕僩斣崋偐傜僜働僢僩傪嶌傝僗僩儕乕儉傪嶌惉偟傑偡
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;// WON'T偱曉摎偟傑偡
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.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);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -