首页 > 学院 > 开发设计 > 正文

黑马程序员【网络编程之UDP协议】

2019-11-15 00:16:44
字体:
来源:转载
供稿:网友
黑马程序员【网络编程之UDP协议】

UDP协议

------- android培训、java培训、期待与您交流! ----------

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表