java的socket编程---telnet客户端的实现
//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客户端的实现相关推荐
- api有哪些 javasocket_基于java的socket编程及API解析
一.socket通讯过程 1.socket与socket编程简介: socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台 ...
- Java 网络 socket 编程
使用套接字实现基于 TCP 协议的服务器和客户机程序 依据 TCP 协议,在 C/S 架构的通讯过程中,客户端和服务器的 Socket 动作如下: 客户端: 1.用服务器的 IP 地址和端口号实例化 ...
- Java的Socket编程
socket编程一般指的就是网络编程,常见的服务端和客户机都是必不可少的,今天小千就来给大家介绍一下socket编程中常见的概念问题. 一.常见传输协议 1.tcp协议TCP (Transmissio ...
- Socket编程(Android客户端+PC服务器端)
一个多月没有写东西了,感觉像过了一个暑假...废话不多说了,今天来记录一下这两天学习Socket的内容.按照我研究思路来进行一步步的深入Socket. 一.什么是Socket 网络上的两个程序通过一个 ...
- java中socket编程实例_Java中socket编程的实现过程(代码实例)
本篇文章给大家带来的内容是关于socket编程的实现过程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.socket 服务器搭建 实例化socket服务器,循环获取请求packa ...
- JAVA之Socket编程(技术总结)
1.socket编程实例1--Socket客户端(字符串)->请求到Socket服务端->响应客户端: 代码如下: import java.io.BufferedReader; impor ...
- java基础—网络编程——TCP客户端与服务端交互
import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import ja ...
- Java基于socket编程实现局域网内简单通信
运行客户端程序将创建一个客户端套接字,并与指定的服务器建立连接,接收了服务端发来的消息后关闭连接.服务端启动后会循环接收客户端连接,在接收到连接后,向该客户端发送 "Hello World! ...
- 【java的socket编程】结合多线程Thread实现通信(使用线程池和非线程池对比)、java开发UDP/IP网络程序
结合多线程实现socket 使用非线程池(拓展Thread) 使用线程池(Executor pool) 使用DatagramPacket DatagramSocket开发UDP/IP程序 使用UDP获 ...
- JAVA之socket编程服务器与客户端通信--实现简易聊天室
本文将介绍TCP和UDP两种服务器与客户端之间的通信协议 1.首先介绍TCP和UDP分别是什么:TCP(Transfer Control Protocol) 是传输控制协议的缩写,被称 TCP / I ...
最新文章
- c语言名字程序,c语言获得程序位数和操作系统位数和名称
- 【TensorFlow】笔记1:入门笔记
- 15年考的全国计算机应用技术,(2015年全国专业技术人员计算机应用能力考试.doc...
- 64位系统matlab上安装libsvm
- commons-lang3工具类学习(三)
- 提升体验-支持Chrome Custom Tabs
- python将html存为pdf_用Python将HTML转为PDF。
- synchronized同步方法概述
- html 为元素附空值,HTML空(void)元素有哪些?
- EditPlus配置Python环境
- (三) 弦截法(试位法)求根
- linux简易扫雷c语言代码,C语言代码实现简易扫雷
- Uipath调用Macro(invoke VBA/Execute Macro/invoke VBScript)
- 揭开A股38位「 90后」董事长的神秘面纱
- 完全卸载 OneDrive / 重装 OneDrive / 解决“已经安装了 OneDrive”
- 数字集成电路:MOS管器件章(一)
- 电视机和机顶盒等焦点问题
- Android新浪微博授权提示:文件不存在 C8998 的终极解决方法
- Ordering类-greatestOf
- Swift的一次函数式之旅
热门文章
- spring IOC快速入门,属性注入,注解开发
- CodeForces 173B Chamber of Secrets(最短路)
- (转)HDOJ 4006 The kth great number(优先队列)
- wubi for ubuntu 9.04 无法运行
- XML入门的常见问题
- 关于员工技术及培训所想
- Python云端系统开发入门 pycharm代码
- [转]c# winform tcp connect timeout 连接超时设置
- #openstack centos6 centos7 kvm镜像制作
- loadrunner—web_url