java 简单地udp服务器----云平台开发学习笔记

应用: 在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

java开发: java中的UDP实现分为两个类:DatagramPacketDatagramSocket。DatagramPacket类将数据字节填充到UDP包中,这称为数据报。 DatagramSocket来发送这个包。要接受数据,可以从DatagramSocket中接受一个 DatagramPack对象,然后从该包中读取数据的内容。


下面来一一说明udp服务器在java中的实现:

----创建数据接收码头,只接受和客户端约定的1080端口的数据

        DatagramSocket ds=new DatagramSocket(1080);

----创建数据接收的数据缓冲区

       DatagramPacket request = new DatagramPacket(new byte[1024], 1024);

----接受来自端口1024的数据包,并存储在集装箱datagramPacket中:注意一旦服务器开启,就会自动监听3000端口,如果 没有数据,则进行阻塞

        ds.receive(dp);

----解析数据包中的信息

       String data=new String(dp.getData(),0,dp.getLength());

----向客户端发送数据包

        DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
        socket.send(response);


服务器代码:

public class UDPService {
    private final static int PORT = 1080    
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket(PORT)) {
            while (true) {
                try {
                    DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
                    socket.receive(request);                  //获取发送端dp
                    String daytime = new Date().toString();  //系统时间
                    byte[] data = daytime.getBytes("ASCII");
                    String data2=new String(request.getData(),0,request.getLength()); //拼接字符串, 发送值
                    DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
                    socket.send(response);                //发送返回值
                    System.out.println("i get:"+daytime + " " + request.getAddress()+"data:"+data2);
                    if(data2.equals("hello"))
                        System.out.println("i'm full!!!!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

public class UDPClient {
	public static void main(String[] args) throws Exception {

        //数据包套接字:相当于码头,专门处理通信数据及进行数据转发设置的
        DatagramSocket ds=new DatagramSocket();

        String message="hello";

        //数据报包:类似于集装箱,用来存储所有的数据信息
        DatagramPacket dp=new DatagramPacket(
                message.getBytes(),   //数据都是已字节数据进行发送的,因此需要将数据进行转换
                message.length(), //发送数据的长度
                InetAddress.getByName("127.0.0.1"),  //发送数据的源ip地址
                1080   //发送数据的端口号
                );

        ds.send(dp);  //数据包通过码头DatagramSocket发送出去
        ds.close();   //数据发送之后关闭通道,减少资源浪费
        System.out.println("发送成功, 等待回应! ");
        
    }

}

测试:



猜你喜欢

转载自blog.csdn.net/qq_37832932/article/details/80543774