`
月下独酌
  • 浏览: 132604 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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写的服务端,能够与客户端进行通信

    2. **Socket编程**:Java的Socket类提供了网络通信的基础,服务端与客户端的通信通常基于TCP/IP协议栈,通过Socket建立连接,实现数据的双向传输。 3. **ServerSocket类**:服务端会使用Java的ServerSocket类来监听...

    telnet.rar telnet 协议 客户端 源代码 java

    《telnet协议与Java客户端源代码解析》 在IT领域,网络通信协议是构建网络应用的基础,其中telnet协议作为一款历史悠久的远程登录协议,它为用户...深入学习和理解这些知识,将有助于我们更好地设计和实现网络应用。

    TCP服务端和TCP客户端工具软件

    本篇文章将详细探讨TCP服务端和TCP客户端的概念、工作原理以及常用的工具软件。 TCP服务端是网络应用程序,它等待来自网络的连接请求,并在接收到请求后提供服务。服务端通常运行在一个特定的IP地址和端口号上,这...

    mina传文件案例,客户端加服务端

    本案例将深入探讨如何使用Mina作为服务端,结合Socket客户端实现文件的传输。 一、Apache Mina框架介绍 Apache Mina,全称为“Minimalist Application Networking Abstraction”,是一个提供了统一的API来处理多种...

    Memcached 客户端 服务端 管理工具

    客户端是应用与Memcached交互的接口,常见的客户端库有libmemcached(C语言)、pylibmc(Python)和memcached-client(Java)等。客户端的主要任务包括: - **连接管理**:建立与服务端的TCP连接或Unix域套接字连接...

    java_socket服务端和客户端编程

    Java Socket服务端和客户端编程是Java网络编程中的核心部分,主要涉及如何在互联网上实现两台计算机之间的通信。网络通信的两大问题是定位主机和数据传输的可靠性与效率。TCP/IP协议族为此提供了解决方案,其中IP层...

    java_socket服务端和客户端编程.pdf

    在Java中,`Socket`和`ServerSocket`提供了丰富的API,便于开发者构建复杂的服务端和客户端应用。需要注意的是,为了保证网络编程的健壮性,应正确处理异常,确保在完成通信后关闭所有打开的流和连接。 总的来说,...

    java_socket服务端和客户端编程.doc

    ### Java Socket服务端和客户端编程知识点详解 #### 一、网络编程基础概念 在Java网络编程中,**Socket**是实现客户端与服务器间通信的重要工具。网络编程主要涉及两个核心问题: 1. **准确定位网络上的主机**:...

    java_socket服务端和客户端编程[借鉴].pdf

    Java Socket服务端和客户端编程是Java软件开发中的一个重要部分,主要涉及网络通信和TCP/IP协议。网络编程的主要目标是定位网络主机并实现可靠的数据传输。TCP/IP协议族在这两方面都扮演了关键角色,其中IP层负责...

    memcached服务端已经多个客户端

    标题"memcached服务端已经多个客户端"指出我们关注的是memcached缓存系统,它包括服务端和多个客户端。这通常意味着我们可以期待一个完整的环境,用于学习、测试或部署memcached,包括服务器组件以及可以与其交互的...

    javasocket服务端和客户端编程.pdf

    Java Socket编程是Java中用于实现网络通信的核心技术,主要用于解决如何在互联网上定位主机和高效传输数据的问题。在TCP/IP协议栈中,IP层通过IP地址确定主机位置,而TCP层提供面向应用的可靠(TCP)或不可靠(UDP)...

    mina 服务器socket客服端发消息

    以上就是使用Java Mina框架创建一个简单的Socket服务端和客户端的实现。在实际应用中,可能还需要考虑异常处理、心跳机制、多线程处理、消息序列化与反序列化等问题。Mina提供的API非常灵活,可以根据需求进行扩展和...

    Java源码包100个设计实例.zip

    Java Telnet客户端实例源码 Java zip压缩包查看程序源码.rar java 一个消息发布网站.rar Java 数字签名、数字证书生成源码.rar Java 版的酒店系统,貌似完整.rar Java 电梯模拟程序 v2.0.rar Java 组播组中发送和...

    java源码包---java 源码 大量 实例

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码...

    基于Java的Linux远程登录系统研究与实现.pdf

    研究和实现这样的系统,除了需要了解Java和Linux操作系统知识外,还需要掌握网络编程知识,特别是对SSH协议的理解。此外,研究者还应该具备一定的软件工程知识,以便在设计系统时能够考虑到软件的易用性、可维护性和...

    Java网络编程技术 JAVA

    总的来说,Java网络编程涉及到客户端和服务端的交互,这需要对`Socket`和`ServerSocket`的使用有深入理解,以及对网络协议如TCP/IP的了解。同时,通过`URL`和`URLConnection`可以方便地访问和处理远程资源,简化了...

    java源码包2

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密...

    java源码包3

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密...

    Netty+telnet根据指令定时上传文件

    1)使用netty搭建一个服务端程序和一个客户端程序 2)客户端把上个练习的错误日志上传到服务端程序 3)拓展功能,实现定时上传错误日志及可以使用telnet连接服务器手动控制上传错误日志 4)使用多线程拓展netty服务端...

    CollectionService.zip

    在"CollectionService"的实现中,每个连接的输入流会被用来读取telnet客户端发送的数据,然后这些数据会被处理并显示在控制台上。这一步骤可能涉及到数据的解析和格式化,以便于理解和分析。同时,如果需要对收集到...

Global site tag (gtag.js) - Google Analytics