java中的网络通信编程之UDP篇

来源:互联网 发布:用友软件现金流量表 编辑:程序博客网 时间:2024/05/01 02:39

上篇文章我们详细说了TCP的具体用法以及它和UDP的区别,这次我们说说UDP中java网络编程中的实际应用。

UDP编程

UDP的英文User Datagram Protocol,中文意思为用户数据报协议。UDP协议在文件传输过程中不需要建立专门的虚拟连接,所以这种协议对服务器压力相对较小,不过UDP的不足在于,它属于不可靠传输,但是也没我们想象中的那么不可靠,就像我给你发短信一样,理论上,是存在你收不到的可能性的。

UDP编程在java中有客户端网络编程和服务端网络编程两个实现。

DatagramSocket

datagramSocket类似于TCP的网络连接,虽说UDP不需要建立专门的虚拟连接,但是毕竟是发送和接受数据,datagramSocket能实现服务端的监听器以及发送端的发送器角色。

DatagramPacket

datagrampacket 类似于网络中数据传输的数据封装,也就是说这个类的对象代表要传输的数据。在传输数据的时候,该类会对数据进行封装,封装后的对象包含目标放的ip地址,端口号以及发送的内容等。接受数据的时候也是以DatagramSocket对象的方式进行接收的,接受的数据包含发送方的ip 端口等信息,当然也包含发送过来的内容。形象点说,DatagramSocket 对象就像个快递,邮寄快递的时候上面有接收方的各种信息,信封里面有内容。

总结来说,UDP在java中的编程方式要比TCP结构要简单一些。

UDP客户端编程涉及的步骤也是4个部分:建立连接、发送数据、接收数据和关闭连接。

1、建立连接

DatagramSocket ds = new DatagramSocket();

该客户端连接使用系统随机分配的一个本地计算机的未用端口号
 当然,可以通过制定连接使用的端口号来创建客户端连接。
DatagramSocket ds = new DatagramSocket(5000);

一般在建立客户端连接时没有必要指定端口号码。

2、发送数据

在发送数据时,需要将需要发送的数据内容首先转换为byte数组,然后将数据内容、服务器IP和服务器端口号一起构造成一个DatagramPacket类型的对象,这样数据的准备就完成了了,发送时调用网络连接对象中的send方法发送该对象即可

String host = "127.0.0.1";      int port = 10001;     //将发送的内容转换为byte数组      byte[] b = s.getBytes();      //将服务器IP转换为InetAddress对象      InetAddress server = InetAddress.getByName(host);      //构造发送的数据包对象      DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port);      //发送数据      ds.send(sendDp);</span>  


在发送数据之前,我们必须对要发送的数据进行封装。
3、服务端接受数据

首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。然后以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象的receive方法接收数据即可。接收到的服务器端反馈数据存储在DatagramPacket类型的对象内部

byte[] data = new byte[1024];      //构造数据包对象      DatagramPacket receiveDp = new DatagramPacket(data,data.length);      //接收数据      ds.receive(receiveDp);      //输出数据内容      byte[] b = receiveDp.getData(); //获得缓冲数组      int len = receiveDp.getLength(); //获得有效数据长度      String s = new String(b,0,len);      System.out.println(s);</span>  


首先构造缓冲数组data,这里设置的长度1024是预估的接收到的数据长度,要求该长度必须大于或等于接收到的数据长度,然后以该缓冲数组为基础,构造数据包对象,使用连接对象ds的receive方法接收反馈数据,由于在Java语言中,除String以外的其它对象都是按照地址传递,所以在receive方法内部可以改变数据包对象receiveDp的内容,这里的receiveDp的功能和返回值类似。数据接收到以后,只需要从数据包对象中读取出来就可以了,使用DatagramPacket对象中的getData方法可以获得数据包对象的缓冲区数组,但是缓冲区数组的长度一般大于有效数据的长度,换句话说,也就是缓冲区数组中只有一部分数据是反馈数据,所以需要使用DatagramPacket对象中的getLength方法获得有效数据的长度,则有效数据就是缓冲数组中的前有效数据长度个内容,这些才是真正的服务器端反馈的数据的内容
4、关闭连接

 ds.close();

UDP方式服务器端网络编程

1、首先UDP方式服务器端网络编程需要建立一个连接,该连接监听某个端口:
 DatagramSocket ds = new DatagramSocket(10010);
由于服务器端的端口需要固定,所以一般在建立服务器端连接时,都指定端口号
2、接收客户端发送过来的数据
其接收的方法和客户端接收的方法一直,其中receive方法的作用类似于TCP方式中accept方法的作用,该方法也是一个阻塞方法,其作用是接收数据。
ds.receive()
接收到客户端发送过来的数据以后,服务器端对该数据进行逻辑处理,然后将处理以后的结果再发送给客户端,在这里发送时就比客户端要麻烦一些,因为服务器端需要获得客户端的IP和客户端使用的端口号,这个都可以从接收到的数据包中获得。示例代码如下:

     //获得客户端的IP     InetAddress clientIP = receiveDp.getAddress();     //获得客户端的端口号     Int clientPort = receiveDp.getPort();


3、关闭连接
ds.close()

1 0