//telnet 的命令格式:IAC+命令码+选项码
final byte IAC=(byte)255;//协商的命令码
final byte DONT=(byte)254;
final byte DO=(byte)253;
final byte WONT=(byte)252;
final byte WILL=(byte)251;
final byte SB=(byte)250;
final byte SE=(byte)240;//协商的选项码
final char IS = '0';
final char SEND = '1';
final char INFO = '2';
final char VAR = '0';
final char VALUE = '1';
final char ESC = '2';
final char USERVAR = '3';final int MAX=1000000;Socket s;
InputStream in;
OutputStream out;
PrintStream ps;
DataInputStream conIn;
BufferedInputStream dataIn;// String sysIn="open\r\n";
byte[] recvByte;    //接收的字节数据
String recv;    //转换后的字符
byte[] sendByte;    //发送的字节数据
String send;    //发送的源字符
int read;   //接收的字节数据的个数
int write;  //发送的字节数据个数
boolean hasData;    //标志套接字中的输入流是否还有未读完的数据String ip;
int port;public Socket2Telnet(Socket s,String ip,int port){
this.s=s;
this.ip=ip;
this.port=port;
}//关闭socket连接
public void closeConnection(Socket s,InputStream in,OutputStream out){
if(s.isConnected()&&!s.isClosed()){
try {
in.close();
out.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}//解析协商数据
public void Compile(){
//存在协商控制命令选项时需要解析并应答
write=0;
for(int i=0;i<read;){
if(recvByte[i]==IAC){ //255
//  System.out.println("get IAC!"+(int)(recvByte[0]& 0xff)+recvByte[0]);
sendByte[write]=recvByte[i];if(recvByte[i+2]==1||recvByte[i+2]==3){if(recvByte[i+1]==DO){ //253
//  System.out.println("get DO!"+(int)(recvByte[1]& 0xff));sendByte[write+1]=WILL;
sendByte[write+2]=recvByte[i+2];
write+=3;
i+=3;
}else
if(recvByte[i+1]==WILL){ //251
//  System.out.println("get WILL !"+(int)(recvByte[1]& 0xff)+recvByte[1]);sendByte[write+1]=DO;
sendByte[write+2]=recvByte[i+2];
write+=3;
i+=3;
}else
if(recvByte[i+1]==WONT){ //252
//  System.out.println("get WONT!"+(int)(recvByte[1]&0xff)+recvByte[1]);sendByte[write+1]=DONT;
sendByte[write+2]=recvByte[i+2];
write+=3;
i+=3;
}else
if(recvByte[i+1]==DONT){ //254
//  System.out.println("get DONT! "+(int)(recvByte[1]&0xff)+recvByte[1]);sendByte[write+1]=WONT;
sendByte[write+2]=recvByte[i+2];
write+=3;
i+=3;
}else
if(recvByte[i+1]==SB){   //250
System.out.println("get SB ! "+(int)(recvByte[1]&0xff)+recvByte[1]);if(recvByte[i+3]==SEND){
System.out.println("get SEND!"+recvByte[3]);
sendByte[write+1]=recvByte[i+1];
sendByte[write+2]=recvByte[i+2];
sendByte[write+3]=IS;
sendByte[write+4]=IAC;
sendByte[write+5]=SE;
System.out.println("YES, get a SD and SEND !");
write+=6;
i+=3;
}
}
//  System.out.println(" and recvByte[2] "+(int)(recvByte[2]&0xff)+recvByte[2]+(char)(recvByte[2]&0xff));//    ps.write(sendByte,0,write);
//  ps.flush();
}else{
if(recvByte[i+1]==DONT||recvByte[i+1]==DO){
sendByte[write+1]=WONT;
sendByte[write+2]=recvByte[i+2];
}
else if(recvByte[i+1]==WILL||recvByte[i+1]==WONT){
sendByte[write+1]=DONT;
sendByte[write+2]=recvByte[i+2];
}
write+=3;
i+=3;
}
}else{
return;
}
}
}//sokcet连接服务器,收发数据
public void run(){
try {
s.connect(new InetSocketAddress(ip,port));
System.out.println("socket Connect success!");
System.out.println("Server IP:"+s.getInetAddress()+",port :"+s.getPort()+"\n");//获取套接字的输入和输出流
in=s.getInputStream();
out=s.getOutputStream ();conIn=new DataInputStream(System.in);
dataIn=new BufferedInputStream(in);
ps=new PrintStream(out);//初始化
recvByte=new byte[MAX];
sendByte=new byte[MAX];
recv=new String("");
send=new String("");
write=read=0;while(true){read=write=0;Thread.sleep(2000);if((read=in.read(recvByte))>0){
hasData=true;
}else
hasData=false;//   System.out.println("recv data "+read+" byte!");
//  System.out.println("recv msg :"+new String(recvByte,"UTF-8"));//   for(int i=0;i<read;i++)
//  System.out.print((char)(recvByte[i]&0xff));
//  System.out.println("");
for(int i=0;i<read;i++)
System.out.print((int)(recvByte[i]&0xff)+" ");
System.out.println("\n");//协商的应答
if(read>0){
Compile();
if(write>0){
ps.write(sendByte,0,write);
//  ps.flush();
}
}System.out.println("read = "+read+",write = "+write);
Thread.sleep(3000);//服务器没有响应时,等待用户输入命令;
//服务器返回输入命令时,告知用户命令,并读取用户输入并发送给服务器;
send="";
if(read<=0||read>write){
System.out.println(read>0?"recv msg:"+new String(recvByte,write,read-write,"UTF-8"):"");
if(read==2) System.out.println("recv two data:"+(recvByte[0]&0xff)+(recvByte[1]&0xff));Scanner sc=new Scanner(System.in);
send=sc.nextLine()+"\r\n";
//  send=conIn.readLine()+"\r\n";if("exit".equals(send)){
closeConnection(s,in,out);
return;
}
System.out.println("send msg :"+send);ps.write(send.getBytes("ISO-8859-1"));
//  ps.flush();
System.out.println("send over!");
}ps.flush();
}
} catch (IOException e) {
System.out.println("Client Connected Failed :\t");
e.printStackTrace();
} catch (InterruptedException e) {
System.out.println("Thread Error!");
e.printStackTrace();
}finally{
closeConnection(s,in,out);
}
}
}

最近在写一个telnet客户端的代码,要求使用socket进行通讯而不是apache的工具包。遂本人在网上找了很多文档,结果发现和之前写的socket实时通讯的工具很像。于是我就毫不思索的将代码copy了一遍,结果运行时悲剧了。每次的socket连接自然没有问题,但是就是没有回应,我这边发送了数据,也没响应。

于是就郁闷了,本人是使用windows环境,telnet虚拟机的open solaris,可是不管怎么调试和修改,就是接受不到数据。没办法只能卡住了,把telnet协议和socket通讯又是一遍一遍的看,网上狂找文档,终于明白了问题的关键。socket通讯可以实现客户端和服务器进行通讯和数据传输,比如ftp,smtp等都可以,但是对于telnet而言,telnet时远程登陆的工具,它是跨平台的(WINDOWSH、LINUX等),因此在通讯时需要将数据和命令转换成双方约定好的格式(NVT,关于NVT这里不多讲,有个故事很形象的描述了这个问题)。

其实最重要的是了解telnet登陆时的细节,telnet在连接时,需要客户端和服务器进行协商,也就是双方规定发送数据的”标准“。

java的socket编程---telnet客户端的实现相关推荐

  1. api有哪些 javasocket_基于java的socket编程及API解析

    一.socket通讯过程 1.socket与socket编程简介: socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台 ...

  2. Java 网络 socket 编程

    使用套接字实现基于 TCP 协议的服务器和客户机程序 依据 TCP 协议,在 C/S 架构的通讯过程中,客户端和服务器的 Socket 动作如下: 客户端: 1.用服务器的 IP 地址和端口号实例化 ...

  3. Java的Socket编程

    socket编程一般指的就是网络编程,常见的服务端和客户机都是必不可少的,今天小千就来给大家介绍一下socket编程中常见的概念问题. 一.常见传输协议 1.tcp协议TCP (Transmissio ...

  4. Socket编程(Android客户端+PC服务器端)

    一个多月没有写东西了,感觉像过了一个暑假...废话不多说了,今天来记录一下这两天学习Socket的内容.按照我研究思路来进行一步步的深入Socket. 一.什么是Socket 网络上的两个程序通过一个 ...

  5. java中socket编程实例_Java中socket编程的实现过程(代码实例)

    本篇文章给大家带来的内容是关于socket编程的实现过程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.socket 服务器搭建 实例化socket服务器,循环获取请求packa ...

  6. JAVA之Socket编程(技术总结)

    1.socket编程实例1--Socket客户端(字符串)->请求到Socket服务端->响应客户端: 代码如下: import java.io.BufferedReader; impor ...

  7. java基础—网络编程——TCP客户端与服务端交互

    import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import ja ...

  8. Java基于socket编程实现局域网内简单通信

    运行客户端程序将创建一个客户端套接字,并与指定的服务器建立连接,接收了服务端发来的消息后关闭连接.服务端启动后会循环接收客户端连接,在接收到连接后,向该客户端发送 "Hello World! ...

  9. 【java的socket编程】结合多线程Thread实现通信(使用线程池和非线程池对比)、java开发UDP/IP网络程序

    结合多线程实现socket 使用非线程池(拓展Thread) 使用线程池(Executor pool) 使用DatagramPacket DatagramSocket开发UDP/IP程序 使用UDP获 ...

  10. JAVA之socket编程服务器与客户端通信--实现简易聊天室

    本文将介绍TCP和UDP两种服务器与客户端之间的通信协议 1.首先介绍TCP和UDP分别是什么:TCP(Transfer Control Protocol) 是传输控制协议的缩写,被称 TCP / I ...

最新文章

  1. c语言名字程序,c语言获得程序位数和操作系统位数和名称
  2. 【TensorFlow】笔记1:入门笔记
  3. 15年考的全国计算机应用技术,(2015年全国专业技术人员计算机应用能力考试.doc...
  4. 64位系统matlab上安装libsvm
  5. commons-lang3工具类学习(三)
  6. 提升体验-支持Chrome Custom Tabs
  7. python将html存为pdf_用Python将HTML转为PDF。
  8. synchronized同步方法概述
  9. html 为元素附空值,HTML空(void)元素有哪些?
  10. EditPlus配置Python环境
  11. (三) 弦截法(试位法)求根
  12. linux简易扫雷c语言代码,C语言代码实现简易扫雷
  13. Uipath调用Macro(invoke VBA/Execute Macro/invoke VBScript)
  14. 揭开A股38位「 90后」董事长的神秘面纱
  15. 完全卸载 OneDrive / 重装 OneDrive / 解决“已经安装了 OneDrive”
  16. 数字集成电路:MOS管器件章(一)
  17. 电视机和机顶盒等焦点问题
  18. Android新浪微博授权提示:文件不存在 C8998 的终极解决方法
  19. Ordering类-greatestOf
  20. Swift的一次函数式之旅

热门文章

  1. spring IOC快速入门,属性注入,注解开发
  2. CodeForces 173B Chamber of Secrets(最短路)
  3. (转)HDOJ 4006 The kth great number(优先队列)
  4. wubi for ubuntu 9.04 无法运行
  5. XML入门的常见问题
  6. 关于员工技术及培训所想
  7. Python云端系统开发入门 pycharm代码
  8. [转]c# winform tcp connect timeout 连接超时设置
  9. #openstack centos6 centos7 kvm镜像制作
  10. loadrunner—web_url