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();
}
}
代码功能即是客户端向服务器发送问候,服务器返回问候。