socket_udp_demo

实现客户端向服务器的一问一答,udp和tcp相比,就显得不可靠,demo中体现在先启客户端访问,再启服务器不会报错,客户端就不知道服务器到底收没收到请求。

服务端代码

package udp_demo;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;

public class UDPServer {

    public static void main(String[] args) throws Exception {
        // 为UDP服务器指定端口
        DatagramSocket ds = new DatagramSocket(10086);
        // 声明一个接收数据包的byte数组
        byte[] b = new byte[1024];
        // 设置数据包,参数为:byte数组,读取数据的起始位,读取数据的终止位
        DatagramPacket dp = new DatagramPacket(b, 0, b.length);
        // 服务器接收数据包
        ds.receive(dp);
        // 解析数据包,参数为:dp中收到的byte数组,读取数据的起始位,读取数据的终止位,以utf-8编码转化成byte
        String msg = new String(dp.getData(), 0, dp.getData().length, "utf-8");

        System.out.println(new Date() + "服务器收到消息,内容:" + msg.trim());

        if ("你好".equals(msg.trim())) {
            msg = "哦";
        } else {
            msg = "滚啊";
        }
        // 设置数据包,参数为字符串以utf-8转换后的byte数组,读取数据的起始位,读取数据的终止位,客户端的ip地址,客户端端口
        dp = new DatagramPacket(msg.getBytes("utf-8"), 0, msg.getBytes().length, InetAddress.getByName("127.0.0.1"),
                10000);
        // 发送数据包
        ds.send(dp);

        System.out.println(new Date() + "服务器回复完毕,内容:" + msg);

        ds.close();
        ds = null;
    }
}

客户端代码:

package udp_demo;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;

public class UDPClient {
    public static void main(String[] args) throws Exception {
        // 设置客户端端口
        DatagramSocket ds = new DatagramSocket(10000);
        // msg
        String msg = "你好啊";
        // 设置数据包,参数为字符串以utf-8转换后的byte数组,读取数据的起始位,读取数据的终止位,服务器的ip地址,服务器端口
        DatagramPacket dp = new DatagramPacket(msg.getBytes("utf-8"), 0, msg.getBytes().length,
                InetAddress.getByName("127.0.0.1"), 10086);
        // 发送数据
        ds.send(dp);

        System.out.println(new Date() + "客户端发送成功,内容:" + msg);
        // 声明一个接收数据包的byte数组
        byte[] b = new byte[1024];
        // 设置数据包,参数为:byte数组,读取数据的起始位,读取数据的终止位
        dp = new DatagramPacket(b, 0, b.length);
        // 接收数据包
        ds.receive(dp);
        // 解析数据包,参数为:dp中收到的byte数组,读取数据的起始位,读取数据的终止位,以utf-8编码转化成byte
        msg = new String(dp.getData(), 0, dp.getData().length, "utf-8");

        System.out.println(new Date() + "客户端收到回复,内容:" + msg);

        ds.close();
        ds = null;
    }
}

先启动服务器再启动客户端,可以看到客户端发送的消息和得到的回服,如:

Wed Aug 29 22:52:55 GMT+08:00 2018客户端发送成功,内容:你好啊
Wed Aug 29 22:52:55 GMT+08:00 2018客户端收到回复,内容:滚啊

但是如果先启动客户端再启动服务器,可以发现客户端发送了消息,看不到回复的消息,却没有报错

你可能感兴趣的:(socket_udp_demo)