java telnet tab指令_Java实现Telnet 客户端代码教程(一)_weixin_39724793的博客-程序员宅基地

技术标签: java telnet tab指令  

时间:2018-12-01

概述:Telnet 客户端

Java实现Telnet 客户端,我们可以使用一些Telnet 客户端软件来连接开通Telnet 服务的主机,本例通过编程实现了一个Telnet 客户端工具。运行程序,就可在客户端登录指定主机,运行程序后产生的界面如下图所示。

3f50565cfa521784496bd98b7ab3877d.gif

Java实现Telnet 客户端运行界面

实现思路:Telnet 类继承了Applet 类,在init()中实现的是此Applet 的初始化,创建接口,通过getParameter()方法获取主机和端口参数。Start()方法通过disconnect()方法关闭上次连接,使用connect()方法建立新的连接。Stop()中使用disconnect()方法关闭连接。Action()方法通过判断事件目标来调用start()或者stop()方法来连接或者中断Telnet 服务。TelnetClient 类继承了Canvas,并实现了Runnable。reshape()方法绘制Telnet 客户端组件大小,connect()方法连接通过指定端口连接指定主机,disconnect()关闭连接,display()方法在Telnet窗口显示字符串。程序代码:

1.编写TelnetClient 类的基本框架,该类继承了Canvas 类,实现了Runnable 接口,包括如下字段:布尔型变量debug,字符串型变量host,整型变量port,Socket 对象变量s,InputStream 对象变量in,OutputStream 对象变量out,Thread 对象变量th,Font 对象变量fn,Image 对象变量back,整型变量x 和y,整型变量width 和height,整型变量w 和h,字符数组ch,Graphics 对象变量gr、b 和bgr,字符串变量term,布尔型变量echo。该类还包括reshape()方法、connect()方法、disconnect()方法、clearch()方法、keyDown()方法、mouseDown()方法、paint()方法、renderchar()方法、run()方法、readch()方法、shutdown()方法、display()方法、displaych()方法、transmit()方法、transmitch()方法,代码如下:

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; // 响应键

public void reshape(int nx, int ny, int nw, int nh);

void connect(String givenhost, int givenport);

void disconnect();

void clearch();

public boolean keyDown(Event e, int k);

public boolean mouseDown(Event e, int x, int y);

public void paint(Graphics g);

void renderchar(char c, int x, int y, boolean back);

public void run();

char readch();

void shutdown();

void display(String str);

void displaych(char c);

void transmit(String str);

void transmitch(char c);

}

2.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);

}

3.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();

}

4.Disconnect()方法用于关闭连接,代码如下:

void disconnect()

{

if (th != null)

{

display("\nDisconnected from "+host+"\n");

th.stop();

th = null;

s = null; in = null; out = null;

}

}

5.Clearch()方法用于清除字符数组重新设置焦点,代码如下:

void clearch()

{

int i,j;

for(i=0; i

for(j=0; j

ch[i][j] = ' ';

x = y = 0;

bgr.setColor(Color.white);

bgr.fillRect(0, 0, width, height);

paint(gr);

}

6.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;

}

7.MouseDown()方法用于处理鼠标左键事件,获得焦点,代码如下:

public boolean mouseDown(Event e, int x, int y)

{

requestFocus();

return true;

}

8.Paint()方法用于绘制图形界面,代码如下:

public void paint(Graphics g)

{

gr.drawImage(back,0,0,this);

}

9.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);

}

}

10.Run()方法用于调用display()方法显示字符,代码如下:

public void run()

{

while(true) displaych(readch());

}

11.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;

}

12.Shutdown()方法用于停止当前线程运行,代码如下:

void shutdown()

{

display("\nConnection closed\n");

s = null; in = null; out = null;

Thread.currentThread().stop();

}

13.Display()方法用于在Telnet 窗口显示字符串,代码如下:

void display(String str)

{

int i;

for(i=0; i

displaych(str.charAt(i));

}

14.Displaych()方法用于在当前鼠标位置显示一个字符,代码如下:

void displaych(char c)

{

if (c == '\n')

{

// 新行

renderchar(ch[x][y], x, y, false);

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

{

for(j=0; j

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)

{ //回退

renderchar(ch[x][y], x, y, false); // erase cursor

if (x != 0) x--;

}

else if (c >= 32 && c < 127)

{

renderchar(c, x, y, true);

ch[x][y] = c;

if (x == w-1) displaych('\n');

else x++;

}

else if (c == 255)

{

char cmd = readch();

char opt = readch();

switch(opt)

{

case 1:

if (cmd == 251) echo = false;

else if (cmd == 252) echo = true;

break;

case 3:

break;

case 24:

if (cmd == 253)

{

transmitch((char)255);

transmitch((char)251);

transmitch((char)24);

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:

if (cmd == 253)

{

transmitch((char)255);

transmitch((char)252);

transmitch((char)opt);

}

break;

}

}

renderchar('_', x, y, false);

}

15.Transmit()方法调用transmitch()方法输出字符串,代码如下:

void transmit(String str)

{

int i;

for(i=0; i

}

16.Transmitch()方法用于输出每个字符,代码如下:

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));

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39724793/article/details/114124539

智能推荐

一文梳理金融风控建模全流程(Python)_风度78的博客-程序员宅基地

一、信贷风控简介 信贷风控是数据挖掘算法最成功的应用之一,这在于金融信贷行业的数据量很充足,需求场景清晰及丰富。信贷风控简单来说就是判断一个人借了钱后面(如下个月的还款日)会不会按期还钱。更专业来说,信贷风控是还款能力及还款意愿的综合考量,根据这预先的判断为信任依据进行放贷,以此大大提高了金融业务效率。与其他机器学习的工业场景不同,金融是极其厌恶风险的领域,其特殊性在于非...

lambda引入时 Error:Execution failed for task ':test:transformClassesWithRetrolambdaForDeb_这是一个秘密的博客-程序员宅基地

在引入tatarka:gradle-retrolambda时报错Error:Execution failed for task ':test:transformClassesWithRetrolambdaForDeb 将版本改为3.7.0即可(我引入的是3.5.0错了)classpath 'me.tatarka:gradle-retrolambda:3.7.0'...

【python】清空jupyter notebook所有输出的命令_嘤桃子的博客-程序员宅基地_jupyter 清空输出

在跑六百万数据集时加了print,导致输出的内容太多,不仅跑了几个小时,还让ipynb文件非常大根本打不开!!清空jupyter notebook输出的命令:jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace xxxx.ipynb如果想把清空所有输出后的源代码文件另存为,命令为:jupyter nbconvert --ClearOutputPreprocessor.enabled=True --to notebook

如何利用github在.md文件中添加图片_曦曦湘涟的博客-程序员宅基地_github md图片

1、在github上的仓库建立一个存放图片的库,库的名字随意。如:Images-blog2、将需要在.md文件中显示的图片整理在一个文件夹中,然后push到Images-blog库中3、然后打开github官网,进入仓库的Images-blog库中,打开图片点击红框所示的按钮,copy地址4、在.md文件中填入:![Image](https://raw.githubuserconte...

前端工程化和webpack_温柔且无情的博客-程序员宅基地

前端工程化和webpack前端工程化简介前端工程化指的是:在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。企业中的Vue项目和React项目,都是基于 工程化 的方式进行开发的。工程化开发好处:自成体系、标准的开发方案和流程前端开发四个现代化:模块化 (JavaScript模块化、CSS模块化、静态资源模块化)组件化 (复用现有的UI结构、样式、行为)规范化 (目录结构的划分、编码规范化、接口规范化、文档规范化、Git分支管理)自动化 (自

React 学习笔记 —— redux 的使用_tanleiDD的博客-程序员宅基地

安装使用运行命令yarn add reduxredux 原理图主要流程组件 通过 Action Creators 分发(dispatch) action 给 StoreStore 将 之前的状态(previousState)、action,传递给 ReducersReducers 对状态处理后,返回给 Store 新的状态组件通过 getState() 获取状态各部分职责Action Creators: 负责生成 action 对象,并分发给 StoreStore:负

随便推点

Image Smoothing via L0 Gradient Minimization基于C++的代码实现_铿锵的玫瑰的博客-程序员宅基地

论文解析图像梯度L0范数最小化图像梯度最小化平滑---一维信号图像梯度最小化平滑---二维图像源代码//实现L0测度平滑Mat L0Smoothing(Mat &amp;amp; image8UC3, double lambda = 2e-2, double kappa = 2.0){ //将输入的图片转换为三通道的Double类型,按原来的像素值进行1...

vue传递json数据给springboot_长春小霸王的博客-程序员宅基地_vue传递json数据

1、前端export function DelProduct(data) { return request({ url: baseURL+'/basefile/Product/delProduct/', //contentType: 'application/x-www-form-urlencoded;charset=utf-8', dataType:'json', contentType:'application/json;charset=UTF-8',

jenkins update center遇到的坑_sunican的博客-程序员宅基地_jenkins updatecenter

目前的环境是,把jenkins.war 放在MAC 的tomcat webapps里尝试修改tomcat,添加参数:vim /Library/Tomcat//conf/context.xml &lt;Context&gt; ... &lt;Environment name="JENKINS_JAVA_OPTIONS" value="-Dhudson.model.UpdateCenter.pluginDownloadReadTimeoutSeconds=120 -Dhudson

el-table tree 改变某一个单元格背景色_aGreetSmile的博客-程序员宅基地

树状结构改变某个单元格颜色,根据层级判断是否展示数据&lt;el-table :data="tableData" style="width: 100%;" :row-key="tableRowKey" border :highlight-current-row="true" :cell-style="tableCellStyle" :tree-props="treeProps" v-on:row-click="rowClick" v-loading="loading" height="100%"&gt

二项检验_loyxCCS的博客-程序员宅基地_二项检验

文章目录检验原理西瓜书2.4节提到了二项检验,看不太懂。参考网上其他人的想法后,记录一下自己的理解。以下内容也包含着自己对假设检验的理解,内容会比较冗长。检验原理对于一个学习器的泛化错误率ϵ\epsilonϵ,我们做出一个猜想(假设):ϵ≤ϵ0\epsilon\le\epsilon_0ϵ≤ϵ0​。那么如何知道这个猜想对不对呢?假如我们已知ϵ\epsilonϵ的值,那么只需将ϵ\epsil...

数据库面经_Sebastian0819的博客-程序员宅基地

数据库系统常问面试题汇总1.数据库索引&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优

推荐文章

热门文章

相关标签