java之网络编程UDP篇

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();
    }
}

代码功能即是客户端向服务器发送问候,服务器返回问候。

猜你喜欢

转载自blog.csdn.net/qq_38180223/article/details/81502584