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

时间: 2024-11-08 04:50:24

黑马程序员【网络编程之UDP协议】的相关文章

黑马程序员—网络编程之UDP

--Java培训.Android培训.iOS培训..Net培训.期待与您交流! -- udp第一讲 ds=new DatagramSocket()即可做发送,也可做接收 字节数组byte [] by=new byte[1024]; 数据包 DatagramPacket dp=new DatagramPacket(by,by.length,InetAddress.getByName("localhost"),8080); DatagramPacket dp2=new DatagramPa

黑马程序员——网络编程之CTP传输

TCP传输 Socket和ServerSocket,实现了两台机器间的套接字端点,绑定本机IP地址.建立客户端和服务端,客户端对应的对象是Socket,服务端对应的对象是ServerSocket. //客户端部分 public class ClientA { private String filePath ; public String getFilePath() {return filePath;} public void setFilePath(String filePath ) { thi

黑马程序员—网络编程之TCP(基础篇)

--Java培训.Android培训.iOS培训..Net培训.期待与您交流! -- 服务端:ServerSocket ss=new ServerSocket(10010); 获取Socket对象 Socket s=ss.accept(); 通过Socket对象获取输入输出流发送消息 客服端:Socket s=new Socket("localhost",10010); 通过Socket对象获取输入输出流发送消息 一 package com.itheima.cn; import jav

java 25 - 4 网络编程之 UDP协议传输思路

UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. E:发送端与接收端是两个独立的运行程序. UDP传输-发送端思路 UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) UDP传输-发送端代码 1 public static void main(Str

java 25 - 4 网络编程之 UDP协议传输的代码优化

UDP协议的输出端: 1 /* 2 UDP发送数据: 3 A:创建Socket发送端对象 4 B:创建数据报包(把数据打包) 5 C:调用Socket对象发送数据报包 6 D:释放资源(底层是IO流) 7 */ 8 public class NewSend { 9 10 public static void main(String[] args) throws IOException { 11 12 // A:创建Socket发送端对象 13 DatagramSocket ds = new Da

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

黑马程序员 网络编程 UDP与TCP

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------/* 网络编程分为两种模式:TCP和UDP 连接互联网的计算机以亿计,为了唯一的标识出每台电脑,互联网就给每台电脑分配一个 唯一独立的ip地址,通过这个ip地址就可以进行计算机之间的数据交换 我们计算机交换的数据功能我们在java中把它封住成一个叫Socket的类, 简称套接字, 端口号:计算机数据的交换一般都是电脑上的程序来维护的,而电脑上又运

黑马程序员——网络编程篇

------- android培训.java培训.期待与您交流! ---------- 概述   1.网络模型        (1).OSI参考模型        (2).TCP/IP参考模型   2.网络通讯要素         (1).IP地址        (2).端口号         (3).传输协议    3.过程        1,找到对方IP. 2,数据要发送到对方指定的应用程序上.为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识. 为了方便称呼这个数据,叫做端口(逻

网络编程之UDP编程

网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送和接受数据报.值得注意的是:UDP编程必须先由客户端发出信息.一个客户端就是一封信,Socket相当于美国式邮筒(信件的收发都在一个邮筒中).端口与协议相关,所以TCP的30