java实现的telnet客户端和服务端

http://www.hackchina.com/r/149844/Telnet.java__html
其实网上关于java的telnet客户端比较多,客户端比如jta26,
服务端口比如pool woman‘s telnet server 简称pwts
有需要的同仁可以去搜索

import java.net.*; 
import java.awt.*; 
import java.io.*; 
import java.lang.*; 
import java.applet.*;

public class Telnet extends Applet 
{ 
	//属性
        String hoststr, portstr;        // 给定主机和端口参数
        Panel controls; 
        TelnetClient tn;                // telnet component 
        TextField hostfield; 
        TextField portfield; 
        Button connect, disconnect; 
  	//初始化
        public void init() 
        { 
        	//创建接口
        	setLayout(new BorderLayout()); 
        	add("Center",tn = new TelnetClient()); 
        	add("North",controls = new Panel()); 
        	controls.setLayout(new FlowLayout()); 
        	controls.add(new Label("Host")); 
        	controls.add(hostfield = new TextField()); 
        	controls.add(new Label("Port")); 
        	controls.add(portfield = new TextField(5)); 
        	controls.add(connect = new Button("Connect")); 
        	controls.add(disconnect = new Button("Disconnect")); 
  
        	// 获取参数 
        	String hoststr = getParameter("host"); 
        	String portstr = getParameter("port"); 
        	if (hoststr == null) return; 
        	if (portstr == null) portstr = "23"; 
        	hostfield.setText(hoststr); 
        	portfield.setText(portstr); 
        } 
  	//启动线程	
        public void start() 
        { 
        	tn.disconnect(); 
        	tn.connect(hostfield.getText(), Integer.parseInt(portfield.getText())); 
        } 
  	//线程停止
        public void stop() 
        { 
        	tn.disconnect(); 
        } 
 	//线程动作 
        public boolean action(Event e, Object arg) 
        { 
        	if (e.target == connect) 
                start(); 
        	else if (e.target == disconnect) 
                stop(); 
        	return true; 
        } 
} 
  
// TelnetClient 
// 连接指定主机和端口 
class TelnetClient extends Canvas implements Runnable 
{ 
	//属性
        boolean debug = false; 		//debug标记
        String host;                    // 远端主机 
        int port;                       // 端口 
        Socket s;                       // 连接 
        InputStream in;                 // 输入流
        OutputStream out;               // 输出流 
        Thread th;                      // 读入数据线程
        Font fn;                        // 当前字体 
        Image back;                     // 背景图片 
        int x, y;                       // 鼠标参数 
        int chw,chh;                    // 字符大小 
        int chd;                        // 字符偏置 
        int width,height;               // Applet大小 
        int w,h;                        // Applet大小 (in chars) 
        char ch[][];                    // 显示的字符数组 
        Graphics gr,bgr;                // 前后图片  
        String term = "dumb";           
        boolean echo;                   // 响应键 
  
        // reshape 
        // 绘制Telnet客户端组件大小 
        public void reshape(int nx, int ny, int nw, int nh) 
        { 
        	if (nw != width || nh != height) 
        	{ 
                	width = nw; 
                	height = nh;  
                	// 设置字体 
                	gr = getGraphics(); 
                	gr.setColor(Color.black); 
                	fn = new Font("Courier",Font.PLAIN,10); 
                	if (fn != null) gr.setFont(fn); 
                	FontMetrics fnm = gr.getFontMetrics(); 
                	chw = fnm.getMaxAdvance(); 
                	chh = fnm.getHeight(); 
                	chd = fnm.getDescent();   
                	// 规划出绘制区域
                	h = nh / chh; 
                	w = nw / chw; 
                	ch = new char [w][h];  
                	// 构造背景图片 
                	back = createImage(width, height); 
                	bgr = back.getGraphics(); 
                	bgr.setFont(fn); 
                	bgr.setColor(Color.black); 
                	clearch(); 
                } 
        	super.reshape(nx,ny,nw,nh); 
        } 
  
        // connect 
        //连接主机 
        void connect(String givenhost, int givenport) 
        { 
        	host = givenhost; 
        	port = givenport;  
        	if (debug) System.out.println("Height = "+String.valueOf(h)); 
        	if (debug) System.out.println("Width  = "+String.valueOf(w));   
        	// 重新显示 
        	clearch(); 
        	echo = true; 
        	requestFocus();  
        	// 打开连接 
        	try 
        	{ 
                	try 
                	{ 
                        	if ((s = new Socket(host,port)) == null) 
                        	{ 
                                	display("Failed to connect to host "+host+"\n"); 
                                	return; 
                                } 
                        } 
                	catch(UnknownHostException e) 
                	{ 
                        	display("Host " + host + " not found\n"); 
                        	return; 
                        } 
                } 
        	catch(IOException e) 
        	{ 
                	display("Failed to connect to host "+host+"\n"); 
                	return; 
                } 
        	try 
        	{ 
                	in = s.getInputStream(); 
                	out = s.getOutputStream(); 
                } 
        	catch(IOException e) 
        	{ 
                	if (debug) System.out.println("Failed to get stream from socket"); 
                	System.exit(5); 
                } 
        	display("Connected to "+host+"\n"); 
        	if (debug) System.out.println("Connected to host");   
        	// 读入数据
        	th = new Thread(this); 
        	th.start(); 
        } 
  
        // disconnect 
        // 关闭连接 
        void disconnect() 
        { 
        	if (th != null) 
        	{ 
                	display("\nDisconnected from "+host+"\n"); 
                	th.stop(); 
                	th = null; 
                	s = null; in = null; out = null; 
                } 
        } 
  
        // clearch 
        // 清除字符数组重新设置游标
        void clearch() 
        { 
        	int i,j; 
        	for(i=0; i<w; i++) 
                for(j=0; j<h; j++) 
                        ch[i][j] = ' '; 
        	x = y = 0; 
        	bgr.setColor(Color.white); 
        	bgr.fillRect(0, 0, width, height); 
        	paint(gr); 
        } 
  
        // keyDown 
        // 点击按钮事件 
        public boolean keyDown(Event e, int k) 
        { 
        	if (out != null) 
        	{ 
                	int kp = e.key; 
                	if (debug) System.out.println("Pressed key " + String.valueOf(kp)); 
                	transmitch((char)kp); 
                	if (echo) 
                	{ 
                        	if (debug) System.out.println("Echo'd "+String.valueOf(kp)); 
                        	displaych((char)kp); 
                        } 
                } 
        	return true; 
        } 
  
        // mouseDown 
        // 按动鼠标获得焦点
        public boolean mouseDown(Event e, int x, int y) 
        { 
        	requestFocus(); 
        	return true; 
        } 
  
        // paint 
        // 绘制图片 
        public void paint(Graphics g) 
        { 
        	gr.drawImage(back,0,0,this); 
        } 
  
        // renderchar 
        // 阅读字符
        void renderchar(char c, int x, int y, boolean back) 
        { 
        	gr.setColor(Color.white); 
        	gr.fillRect(x*chw, y*chh, chw, chh); 
        	gr.setColor(Color.black); 
        	gr.drawString(String.valueOf(c), x*chw, (y+1)*chh-chd);   
        	if (back) 
        	{ 
                	bgr.setColor(Color.white); 
                	bgr.fillRect(x*chw, y*chh, chw, chh); 
                	bgr.setColor(Color.black); 
                	bgr.drawString(String.valueOf(c), x*chw, (y+1)*chh-chd); 
                } 
        } 
  
        // run 
        // 阅读和显示字符 
        public void run() 
        { 
        	while(true)  displaych(readch()); 
        } 
  
        // readch 
        // 从另一个终端读入字符 
        char readch() 
        { 
        	int c = 0; 
        	try {        c = in.read(); } 
        	catch(IOException e) 
        	{        shutdown();} 
        	if (c == -1) shutdown(); 
        	if (debug) System.out.println("Got char "+String.valueOf(c)+" = "+String.valueOf((char)c)); 
        	return (char)c; 
        } 
  
        // shutdown 
        // 中断连接 
        void shutdown() 
        { 
        	display("\nConnection closed\n"); 
        	s = null; in = null; out = null; 
        	Thread.currentThread().stop(); 
        } 
  
        // display 
        // 在Telnet窗口显示字符串 
        void display(String str) 
        { 
        	int i; 
        	for(i=0; i<str.length(); i++) 
                	displaych(str.charAt(i)); 
        } 
  
        // displaych 
        // 在当前鼠标位置显示一个字符 
        void displaych(char c) 
        { 
        	if (c == '\n') 
        	{ 
                	// 新行 
                	renderchar(ch[x][y], x, y, false);      // erase cursor 
                	x = 0; 
                	if (y == h-1) 
                	{ 
                        	gr.copyArea(0, chh, w*chw, (h-1)*chh, 0, -chh); 
                        	gr.setColor(Color.white); 
                        	gr.fillRect(0, (h-1)*chh, width, chh); 
                        	bgr.copyArea(0, chh, w*chw, (h-1)*chh, 0, -chh); 
                        	bgr.setColor(Color.white); 
                        	bgr.fillRect(0, (h-1)*chh, width, chh); 
                        	int i,j; 
                        	for(i=0; i<w; i++) 
                        	{ 
                                	for(j=0; j<h-1; j++) ch[i][j] = ch[i][j+1]; 
                                	ch[i][h-1] = ' '; 
                                } 
                        } 
                	else       y++; 
                } 
        	else if (c == '\t') 
        	{      //Tab           	
                	int i; 
                	for(i=8; i>x%8; i--) displaych(' '); 
                } 
        	else if (c == (char)8) 
        	{   // Backspace 
                	renderchar(ch[x][y], x, y, false);      // erase cursor 
                	if (x != 0) x--; 
                } 
        	else if (c >= 32 && c < 127) 
        	{  // Some printable character 
                	renderchar(c, x, y, true); 
                	ch[x][y] = c; 
                	if (x == w-1) displaych('\n'); 
                	else    x++; 
                } 
        	else if (c == 255) 
        	{ 
                	// Telnet IAC 
                	char cmd = readch(); 
                	char opt = readch();  
                	switch(opt) 
                	{ 
                        case 1:         // echo 
                        	if (cmd == 251) echo = false; 
                        	else if (cmd == 252) echo = true; 
                        	break; 
  
                        case 3:         // supress go-ahead 
                        	break; 
  
                        case 24:        // terminal type 
                        	if (cmd == 253) 
                        	{ 
                                	// IAC WILL terminal-type 
                                	transmitch((char)255); 
                                	transmitch((char)251); 
                                	transmitch((char)24); 
                                	// IAC SB terminal-type IS <term> IAC SE 
                                	transmitch((char)255); 
                                	transmitch((char)250); 
                                	transmitch((char)24); 
                                	transmitch((char)0); 
                                	transmit(term); 
                                	transmitch((char)255); 
                                	transmitch((char)240); 
                                } 
                        	else if (cmd == 250) 
                        	{ 
                                	while(readch() != 240); 
                                } 
                        	break; 
  
                        default:        // some other command 
                        	if (cmd == 253) 
                        	{ 
                                	// IAC DONT whatever 
                                	transmitch((char)255); 
                                	transmitch((char)252); 
                                	transmitch((char)opt); 
                                } 
                       	 	break; 
                        } 
                } 
        	renderchar('_', x, y, false);   // draw cursor 
        } 
  
        void transmit(String str) 
        { 
        	int i;  
        	for(i=0; i<str.length(); i++)  transmitch(str.charAt(i)); 
        } 
  
        void transmitch(char c) 
        { 
        	if (c == '\n') transmitch('\r'); 
        	try 
        	{ 
                	out.write((int)c); 
                	out.flush(); 
                } 
        	catch(IOException e){ };   
        	if (debug) 
        	System.out.println("Sent char " + String.valueOf((int)c) + " = " + String.valueOf(c)); 
        } 
}

你可能感兴趣的:(java,C++,c,socket,C#)