UDP实现发送消息和文件上传--Java网络编程(三)|Java 开发实战

2,151 阅读4分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

本文正在参加「Java主题月 - Java 开发实战」,详情查看 活动链接


前言

生活中经常会收到骚扰电话和骚扰短信,骚扰电话可以抽象的理解为TCP,而骚扰短信可以抽象的理解为UDP。我只要知道你的地址,不管你愿不愿意接收,发送是否成功,我都可以直接进行发送~

什么是UDP?

  • UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

  • 它有以下几个特点:

      1. 面向无连接
    • 首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。

    • 具体来说就是:

    • 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作

  • 有单播,多播,广播的功能

    • UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
  • UDP是面向报文的

    • 发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文
  • 不可靠性

    • 首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。

    • 并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

    • 再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。

一、UDP实现发送消息

客户端代码模拟:

/**
 * 客户端
 */
public class UdpClient {
    public static void main(String[] args) throws Exception{
        //建立socket的同时也给自己绑定一个端口为8888
        DatagramSocket socket = new DatagramSocket(8888);

        //数据包,这里可以从控制台拿到
        //String msg = "你好,先生,首付8.8万的江北新区大三房考虑嘛?";
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            //获取控制台的数据并且将其转为字节数组
            byte[] msg = bufferedReader.readLine().getBytes();
            //发送给谁?
            InetAddress ip = InetAddress.getByName("127.0.0.1");
            int port = 7777;
            //参数分别是,数据包,起始位置,结束位置,ip,端口
            DatagramPacket packet = new DatagramPacket(msg,0,msg.length,ip,port);

            //开始发送
            socket.send(packet);
            //如果对方发送 拜拜 我们就断开
            if (bufferedReader.readLine().equals("拜拜")){
                break;
            }
        }
        //关闭连接
        socket.close();
    }
}

服务端代码模拟:

/**
 * 服务端
 */
public class UdpServer {
    public static void main(String[] args) throws Exception{
        //开发端口
        DatagramSocket socket = new DatagramSocket(7777);
        //接收数据包
        byte[] buffer = new byte[1024];

        while (true){
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
            socket.receive(packet); //阻塞接收


            byte[] bytes = packet.getData();
            String msg = new String(bytes,0,bytes.length);
            System.out.println(msg);

            //断开连接
            if (msg.equals("拜拜")){
                break;
            }
        }
        //关闭连接
        socket.close();
    }

}

客户端执行结果: 在这里插入图片描述 服务端执行结果: 在这里插入图片描述

至此,骚扰短信的基本功能已经实现,其实可以实现双向聊天的。在此就不展开说了~


路漫漫其修远兮,吾必将上下求索~ 如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah