java中的网络通信编程之UDP篇
上篇文章我们详细说了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>
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()