这是我参与更文挑战的第7天,活动详情查看: 更文挑战
本文正在参加「Java主题月 - Java 开发实战」,详情查看 活动链接
前言
生活中经常会收到骚扰电话和骚扰短信,骚扰电话可以抽象的理解为TCP,而骚扰短信可以抽象的理解为UDP。我只要知道你的地址,不管你愿不愿意接收,发送是否成功,我都可以直接进行发送~
什么是UDP?
-
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
-
它有以下几个特点:
-
- 面向无连接
-
首先 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