㈠ TCP/IP协议 怎么用java发送和接收二进制数据 要具体实例
1.TCP/IP协议要求信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。如何发送和解析信息需要一定的应用程序协议。
2.信息编码:
首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是
big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位操作(移位和屏蔽)就可以了。
具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用
DataInputStream类和ByteArrayInputStream类。
其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded character
set)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用
String的getBytes()方法。
最后,位操作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或操作;要清空特定一位,用与操作。
3.成帧与解析
成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。
如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收
到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至
全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。
有两个技术:
1.基于定界符(Delimiter-based):消息的结束由一个唯一的标记(unique
marker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。幸运的是,填充(stuffing)技术
能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符。在接收者扫描定界符时,还能识别出修改过的数据,并在输出消息中对其进行还原,从而
使其与原始消息一致。
2.显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。
接口:
Java代码 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:
Java代码 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }
显式长度方法:
Java代码 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.length>MAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.length>>BYTEMASK)&BYTEMASK); out.write(message.length&BYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0<=length<=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }
㈡ Java程序语言有哪些技术优势呢
IT行业迅速发展,各种编程语言、装饰设计、平面设计、网站设计等各有各的优点,但是在如此众多的科目中,Java开发为何能够20年屹立不倒,仍然成为就业率高,行业发展前景最被看好的一门呢!
Java的最大一个优点就是它的跨平台性。只需要你一次物行编写好,就能够运行在各种平台上,这样系统的移植、平台的迁移变就更容易,更改成本降到最低。下面电脑培训就具体、全方位的浅谈下Java语言的优势,为什么现在Java市场需求量供不应求,就业率高,发展前景好!
1.简单
Java语言是面向对象中的一种,通过提供最基本的方法去完成指定任务,你理解了一些基本概念后,就可以编写出适合于各种情况的应用程序。
2.面向对象
Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类是提供了一类对象的原型,通过继承的机制,子类能使用父类提供的方法,实现代码重复使用。
3.分布性
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其他对象。
4.鲁棒性
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。Java在使用时,通过集成的面向对象的异常处理机制,Java提示出可能出现但未被处理的异常,帮助程序员正确地进行选择以防止系统的崩溃。同时,Java还可捕获类型声明中的许多常见错误,防止出现动态运行时不匹配问题。
5.安全性
用于网络、分布环境下的Java必须防止病毒的入侵。Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使雹蚂扰用“特洛伊”木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
6.可移植性
与平台无关的特性使Java程序可以方便地移植到网络上的不同机器。同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行源旦时系统由标准C语言实现,这使得Java系统本身也具有可移植性。
7.解释执行
Java解释器直接对Java字节码进行解释执行。字节码本身携带了许多编译时信息,使得连接过程更加简单。
8.高性能
和其他解释执行的语言不同,Java字节码的设计很容易地直接转换成对应于特定CPU的机器码,可以提交性能。
9.动态性
Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。Java通过接口来支持多重继承,更具有灵活性和扩展性。
㈢ JAVA Socket 底层是怎样基于TCP/IP 实现的
首先必须明确:TCP/IP模型中有四层结构: 应用层(Application Layer)、传输层(Transport Layer)、网络层(Internet Layer
)、链路层(LinkLayer)
其中Ip协议(Internet Protocol)是位于网络层的,TCP协议时位于传输层的。通过Ip协议可以使可以使两台计算机使用同一种语言,从而允许Internet上连接不同类型的计算机和不同操作系统的网络。Ip协议只保证计算机能够接收和发送分组数据。当计算机要和远程的计算机建立连接时,TCP协议会让他们建立连接:用于发送和接收数据的虚拟电路。
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。JAVA
有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;Socket,客户端用它初始一次连接。侦听套接字只能接收新的连接请求,不能接收实际的数据包,即ServerSocket不能接收实际的数据包。
套接字是基于TCP/IP实现的,它是用来提供一个访问TCP的服务接口,或者说套接字socket是TCP的应用编程接口API,通过它应用层就可以访问TCP提供的服务。
在JAVA中,我们用 ServerSocket、Socket类创建一个套接字连接,从套接字得到的结果是一个InputStream以及OutputStream对象,以便将连接作为一个IO流对象对待。通过IO流可以从流中读取数据或者写数据到流中,读写IO流会有异常IOException产生。
㈣ Java怎么实现对IP/TCP协议数据包的拦截
众所周知,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。
二.JPCAP机制
JPCAP的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的typedef struct _ADAPTERADAPTER,getDeviceList()对应pcap_findalldevs()等等。 JPCAP有16个类,下面就其中最重要的4个类做说明。
1.NetworkInterface
该类的每一个实例代表一个网络设备,一般就是网卡。这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。
㈤ java语言有哪些特点
java语言有哪些特点?java语言的主要特点是什么,相信学习java的朋友都想要深入的了解。
1、easy:java的语法比c++的相对简单,另一个方面就是java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。
2、分布式:java带有很强大的tcp/ip协议族的例程库,java应用程序能够通过url来穿过网络来访问远程对象,由于servlet机制的出现,使java编程非常的高效,现在许多的大的webserver都支持servlet。
3、oo:面向对象设计是把重点放在对象及对象的接口上的一个编程技术。其面向对象和c++有很多不同,在与多重继承的处理及java的原类模型。
4、健壮特性:java采取了一个安全指针模型,能减小重写内存和数据崩溃的可能型。
5、安全:java用来设计网路和分布系统,这带来了新的安全问题,java可以用来构建防核首备病毒和防攻击的system。事实证明java在防毒这一方面做的比较好。
6、中立体系结构:java编译其芹友生成体系结构中立的目标文件格改毁式可以在很多处理器上执行,编译器产生的指令字节码(javabytecode)实现此特性,此字节码可以在任何机器上解释执行。
7、可移植性:java中对基本数据结构类型的大小和算法都有严格的规定所以可移植性很好。
8、多线程:java处理多线程的过程很简单,java把多线程实现交给底下操作系统或线程程序完成.所以多线程是java作为服务器端开发语言的流行原因之一。
9、applet和servlet:能够在网页上执行的程序叫applet,需要支持java的浏览器很多,而applet支持动态的网页,这是很多其他语言所不能做到的。
java语言有哪些特点?要学习精湛的Java技术,来南邵java培训南邵北大青鸟学校,助你早日成才。
㈥ Java TCP/IP协议的Socket如何设置端口复用
你的其中一端的连接没有被及时释放掉的原因是:你没有顺利地进行TCP连接关闭的流程。最近我就因为这个问题头疼了好久,现在终于找到真正的原因和解决办法了!关键点是:在调用close之前先发送一次数据(例如,out.write(0);)。接下来我用通俗的语言来阐述原因。
如果你两端的程序都是在传送完数据后直接调用Socket的close方法断开连接的话,这就会有一个调用close方法谁先谁后的问题,先调用者是主动关闭TCP连接的那一方,而后调用者就是被动关闭TCP连接的那一方。
关闭TCP连接的过程中,双方总共有3个报文需要发送,主动关闭方只需发送1个报文,就是断开请求的报文,被动关闭方要发送2个报文,分别是 回应主动关闭方发来的断开请求报文的第一次确认报文和 第二次确认报文,第二次的确认报文用来确认已经没有数据需要发送了。
主动关闭方发送了断开请求报文后,就进入了等待被动关闭方发送确认报文的状态,一般情况下,被动关闭方马上就会发送第一次确认报文。主动关闭方收到第一次确认报文后,就会等被动关闭方的第二次确认报文,直到超时,套接字资源被操作系统回收(P.S. 虽然书上不是这么说的,但是实际的OS就是这么处理的,原因下面再说)。此时如果被动关闭方发送了第二次确认报文,整个TCP连接关闭流程就顺利结束了,所有资源就会被OS回收。
重点来了,问题在于,作为被动关闭方的程序中,在主动关闭方等待被动关闭方发送第二次确认报文时,就算执行了Socket的close也不会发送第二次确认报文,只有向主动关闭方发送数据(任意)后,被动关闭方才会发送第二次确认报文,整个流程才能顺利进行,TCP连接的资源才会被释放,下次才能重复使用同个套接字。
我自己实验出来的结果是:在两端的代码中(只有一端发送一端接收),都只使用
out.write(0);
me.close();
进行TCP连接的断开,out是Socket的OutputStream,me是已连接的Socket对象。结果,无论重复多少次运行,都能不间断地顺利运行,每次运行结束后,用资源监视器看TCP连接情况,都看到所使用的连接资源都已经被释放,并没有等待2MSL时间后才被释放,所以实际的OS的处理跟理论上的不一样。所以你的程序要等一段时间后才能再次使用同个端口并不是因为存在2MSL的等待时间,而是因为TCP连接关闭流程没有顺利进行,但是所使用的进程已经退出,OS就会自动帮你回收资源,不过需要等超时后才处理。(P.S. 我测试的OS是Windows)
如果两端的程序断开TCP连接时都是直接开始断开的过程而没有延时的话,谁是主动关闭方就不确定,两端的程序中的断开TCP连接的代码就得有发送数据的部分,如果其中有一方延时了,那延时的一方就有很大的概率是被动关闭方,另一方在调用close前就不需要发送数据了。
还有,就算TCP连接关闭的流程顺利进行,但是,下次使用同个套接字(两端套接字跟之前的相同)前得延时一下,几百毫秒就够了(具体自己调整),因为OS回收套接字资源是需要时间的,关闭TCP连接后就立马创建两端套接字跟所关闭的连接的两端套接字相同的连接也有可能因为仍然被占用而报错。