基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证。也就是说,数据在传输时,用户无法知道能否正确地到达目的地主机,也不能确定数据到达目的地地顺序是否和发送地顺序相同。
基于UDP通信地基本模式如下:
(1)将数据打包,称为数据包,然后将数据包发往目的地。
(2)接收别人发来地数据包,然后查看数据包中地内容。
发送数据包
用DatagramPacket类将数据打包,即用DatagramPacket类创建一个对象,称为数据包。用DatagramPacket地以下两个构造方法创建待发送地数据包: DatagramPacket(byte data[], int length, InetAddtress address, int port);
使用该构造方法创建地数据包对象具有下列两个性质:
(1)含有data数组指定地数据
(2)该数据包将发送到地址是adress、端口号是port的主机上。
用DatagramSocket类的不带参数的构造方法DatagramSocket()创建一个对象,该对象负责发送数据包。例如:
DatagramSocket mail_out= new DatagramSocket();
mail_out.send(data_pack);
下面附上Mac.java
, 其中使用了AES和Base64加解密。
接收数据包
用DatagramSocket的另一个构造方法DatagramSocket(int port)创建一个对象,其中的参数必须和待接收的数据包的端口号相同。例如,如果发送方发送的数据包的端口是5666,那么如下创建DatagramSocket对象:
DatagramSocket mail_in= new DatagramSocket(5666);
然后对象maill_in使用方法receive(DatagramPacket pack)接收数据包。该方法有一个数据包参数pack,方法receive把收到的数据包传递给该参数。因此,用户必须预备一个数据包,以便收取数据包。这时需使用DatagramPack类的另一个构造方法DatagramPacket(byte data[], int length)创建一个数据包,用于接收数据包,例如:
byte data[]= new byte[100];
int length= 90;
DatagramPacket pack= new DatagramPacket(data, length);
mail_in.receive(pack);
该数据包pack将接收长度是length字节的数据放入data。
值得注意的是: receive方法可能会堵塞,直到收到数据包。
下面附上Shens.java
, 其中同样使用了AES、Base64加解密。
由于使用了Base64加解密,会出现Base64 cannot be resolved to a type
这个错误。可以参考我的上一篇博文,那里有解决的方法。