zoukankan      html  css  js  c++  java
  • 网络编程之UDP协议

                                                 UDP协议

        UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

        提到无连接数据传输,那我们首先想到的就是不可靠,数据丢失等等,那么在我们的日常软件中,UDP协议到底都应用在什么场景上呢?举一个大家比较熟悉的例子,就是我们平时所用的聊天软件,因为我们的聊天软件所传输的数据并非是重要数据。

        通过ip和端口号,我们可以实现一个小的聊天软件,有兴趣的朋友可以在局域网内通过该软件聊天,安全无插件。好了 废话不多说,我们直接上代码:

    //发送端
    public class UdpSend {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            Scanner input = new Scanner(System.in);
            DatagramSocket ds = new DatagramSocket();
            System.out.println("请输入聊天语句:");
            String name = input.next();
            byte[] b = name.getBytes();
            DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress
                    .getByName("192.168.15.80"), 10000);
            ds.send(dp);
            ds.close();
        }
    }
    //接收端
    public class UdpReceive {
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            DatagramSocket ds = new DatagramSocket(10000);
            byte[] b = new byte[1024];
            DatagramPacket dp = new DatagramPacket(b, b.length);
            ds.receive(dp);
            String data = new String(dp.getData(), 0, dp.getLength());
            System.out.println(data);
        }
    }

        我用的是MyEclipse写的代码,有兴趣的童鞋直接粘过去就能用,但是使用时大家会发现一个很明显的缺点,就是只能发送或接受一次程序就运行结束了,这样要怎么解决呢?我的解决方案是在外侧套上一个while(true)的循环,通过条件判断何时退出程序,听起来很简单,可是在加循环的时候要注意一点,就是位置问题,要特别注意的是不能将所有代码一股脑的放到循环中,因为DatagramSocket对象如果放到循环中,那么下次循环执行时就不再是同一对象。正确修改代码如下:

    //发送端
    public class UdpSend {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            Scanner input = new Scanner(System.in);
            DatagramSocket ds = new DatagramSocket();
            while (true) {
                System.out.println("请输入聊天语句:");
                String name = input.next();
                byte[] b = name.getBytes();
                DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress
                        .getByName("192.168.0.3"), 10000);
                ds.send(dp);
                if (name.equals("结束")) {
                    break;
                }
            }
            ds.close();
        }
    }
    //接收端
    public class UdpReceive {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            DatagramSocket ds = new DatagramSocket(10000);
            while (true) {
                byte[] b = new byte[1024];
                DatagramPacket dp = new DatagramPacket(b, b.length);
                ds.receive(dp);
                String data = new String(dp.getData(), 0, dp.getLength());
                System.out.println(data);
            }
        }
    }

        这样一个可以一直在局域网内聊天的小程序就完成了。因为UDP的不可靠性,数据包在传输时会发生跳变,可能发生不可预知的错误。

  • 相关阅读:
    遍历系统进程
    AS3.0实现图像的扭曲
    CMainFrame, View, Doc, App之间的组织
    进程的创建
    自定义异常
    VC6.0快捷键(转载)
    WinMain与应用程序类之间的联系
    解决在Chrome下无法获取showModalDialog返回值的问题
    用js编解码base64
    根据一个绝对路径获取相对路径的方法
  • 原文地址:https://www.cnblogs.com/fanfu1/p/4524113.html
Copyright © 2011-2022 走看看