java之网络编程UDP篇
UDP介绍
UDP(user datagram protocol)用户数据报协议,传输层协议。
tcp和udp的区别:
Tcp是面向连接的,udp是无连接的; Tcp是可靠的,udp是不可靠的; Tcp只支持点对点通信,udp支持一对一,一对多,多对多的通信模式; Tcp是面向字节流的,udp是面向报文的; Tcp有拥塞控制机制;udp没有拥塞控制,适合媒体通信; Tcp首部开销(20个字节)比udp的首部开销(8个字节)要大;
使用UDP的协议:
DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。 SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。 TFTP(Trival File Transfer Protocal):简单文件传输协议,该协议在熟知端口69上使用UDP服务。
总的来说,相比于TCP而言,UDP不如其广泛,但是在需要很强的实时交互性场合,如网络游戏和视频会议方面,UDP相对重要。因为UDP协议不需要维持连接的开销,支持一对多。多对多的通信模式。如果说TCP类似于打电话,而UDP就相当于发短信。
在网络编程中,必须要求可靠数据传输的信息一般使用TCP,而一般的数据使用UDP实现。
java中的UDP实现
同TCP一样,java的java.net包中,也提供了两个类DatagramSocket和DatagramPacket来支持UDP的数据报(Datagram)通信。
其中DatagramSocket用于在程序之间建立传送数据报的通信通道,DatagramPacket则用来表示一个数据报。DatagramSocket发送的每个包都需要指定地址,而DatagramPacket则是在首次创建时指定地址,以后所有数据的发生都通过此socket。
UDP的客户端编程也是4个部分:建立连接、发送数据、接受数据和关闭连接。
而UDP方式的网络编程的服务端实现,也是同TCP方式的服务器端实现类似,也是服务器端监听某个端口,然后获得数据报文包,进行逻辑 处理后将处理以后的结果反馈给客户端,最后关闭网络连接。
服务器端代码如下:
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPserver { public static void main(String[] args) throws Exception{ int serverPort = 9999; DatagramSocket ds = null; DatagramPacket sendDp; DatagramPacket receiveDp; ds = new DatagramSocket(serverPort); System.out.println("服务器创建成功!端口号为: "+ds.getLocalPort()); byte[] buf = new byte[1024]; receiveDp = new DatagramPacket(buf,buf.length); ds.receive(receiveDp); System.out.println("收到: "+ receiveDp.getSocketAddress()); System.out.println("Data is "+ new String(receiveDp.getData(),0,receiveDp.getLength())); InetAddress clientIp = receiveDp.getAddress(); int clientPort = receiveDp.getPort(); String respose = "OK,收到来自星星的你的祝福"; byte[] bData = respose.getBytes(); sendDp = new DatagramPacket(bData,bData.length,clientIp,clientPort); ds.send(sendDp); ds.close(); } }
客户端代码如下:
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPclient { public static void main(String[] args) throws Exception{ DatagramSocket ds = null;// DatagramPacket sendDp; DatagramPacket receiveDp; String serverHost = "127.0.0.1"; int serverPort = 9999; ds = new DatagramSocket(); byte[] buf = "hello,UDP协议!来自星星的问候……".getBytes(); sendDp = new DatagramPacket(buf,buf.length,InetAddress.getByName(serverHost),serverPort); ds.send(sendDp); byte[] bufr = new byte[1024]; receiveDp = new DatagramPacket(bufr,bufr.length); ds.receive(receiveDp); byte[] response = receiveDp.getData(); int len = receiveDp.getLength(); String s = new String(response,0,len); System.out.println("服务器端反馈为: "+s); ds.close(); } }
代码功能即是客户端向服务器发送问候,服务器返回问候。