网络编程之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的不可靠性,数据包在传输时会发生跳变,可能发生不可预知的错误。

posted @ 2015-05-23 14:37  繁复  阅读(330)  评论(0编辑  收藏  举报