• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

Java网络编程UDP通信原理

JAVA相关 2926143939 1947次浏览 0个评论

前言

继续今天我们的Java网络编程——TCP和UDP通信

一、TCP和UDP概述

传输层通常以TCP和UDP协议来控制端点与端点的通信

  TCP UDP
协议名称 传输控制协议 用户数据包协议
是否连接 面向连接的协议。数据必须要建立连接 无连接的协议,每个数据报中都给出完整的地址信息,因此不需要事先建立发送方和接受方的连接
是否可靠 可靠协议。确保收方完全地获取发送方所发送的全部数据 不可靠协议。发送方所发送的数据报并不一定以相同的次序到达接收方。
可以传输的数据大小 传输数据大小不受限制。一旦连接建立,双方可以按统一的格式传输大的数据 传输数据时是有大小限制的。每个被传输的数据报必须限定在64KB之类
数据传输方式 IO流 DatagramPacket

二、UDP

1.UDP通信概述

UDP协议是一种对等通信的实现,发送方只需要接受方的IP(地址)和Port(端口),就可以直接向它发送数据,不需要线连接。每个程序都可以作为服务器,也可以作为客户端。UDP是一种无连接的传输协议,每个数据报的大小限定在64KB以内。数据报是一个在网络上发送的独立信息,它的到达。到达时间以及内容本身等都不能得到保证。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有较高的效率。
使用UDP协议进行数据传输是,需要将需要传输数据定义为数据报(DatagramPaket),在数据报中指明数据所要到达Socket(主机地址和端口号),然后再将数据报发送出去。实例化DatagramPacket时使用参数port和没有使用参数port的区别在与,提供port的一方可以让别人主动发送消息过来,而没有参数port的则会在发送消息时自动绑定一个本地没有使用的端口。在接收到发送的数据报(DatagramPaket)时,不仅可以获取数据,还可以获得发送方的IP和Port,这样就可以向发送方发送数据,因此,本质上二者是对等的。

2.UDP通信特点

1、UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的原地址或目的地址,它在网络上任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
2、UDP不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频视频和普通数据在传输时使用UDP较多,因为它们即使偶尔丢一两个数据包,也不会对接收结果产生太大的影响。
代码如下(示例):

3.UDP通信传输实现的基石

UDP通信的Socket使用DatagramSocket类实现,数据报使用DatagramPaket实现

3.1、DatagramPake常用方法

InetAddress getAddress() 得到发送方IP地址
int getPort() 得到发送方的端口号
byte[] getData() 返回接收缓冲区,这是一个byte[]
int getLength() 接收字节的真实大小,通常用于从byte[]中提取出有效数据
int getOffset() 返回将要发送或则接收的数据偏移量

3.2、DatagramSocket常用方法

DatagramSocket() 空构造函数
DatagramSocket(int port) 指定通信端口
void receive(DatagramPaket p) 接收数据报
void send(DatagramPaket p) 发送数据报
void close() 关闭Socket

4.UDP通信实现原理

无论一个UDP通信程序的功能多么功能齐全,程序多么复杂,七基本结构都是一样的,都包括以下四个基本步骤
1、在接收端指定一个端口号来创建DatagramSocket,然后创建一个接收数据报(DatagramPaket),使用recevie方法等待发送方请求报文,这将阻塞服务器线程
2、在发送方创建一个DatagramSocket,使用接收方的IP和端口来创建发送数据报(DatagramPaket),使用send方法发送。现在接收方的recevie方法被唤醒,同时会将发送方的数据报内容填充到接收方的DatagramPaket中。
3、接收方从发送方的数据报中获得发送方的IP和端口,使用它们构造一个发送数据报,然后发送给发送方,这样就实现了发送方和接收方的通信
4、在通信完成后,在客服端和服务端中分别关闭Socket

5.UDP通信原理(代码实现)

代码如下(发送端):

import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendMessage { public static void main(String[] args) throws Exception { // 创建发送端Socket对象 DatagramSocket sendSocket = new DatagramSocket(); // 准备需要发送的数据 String message = "hello"; // 创建一个缓冲区 byte[] messageByte = message.getBytes(); // 获取缓冲区中数据的真实长度 int messageLen = message.length(); // InetAddress实例化获取本机通信地址 InetAddress address = InetAddress.getLocalHost(); // 设置通信端口号 int port = 12345; // 打包数据 DatagramPacket sendPacket = new DatagramPacket(messageByte, messageLen, address, port); // 发送数据 sendSocket.send(sendPacket); // 发送端等待接收端成功接收信息后返回的回应 // 创建一个缓冲区,容量尽量设置大一点因为不知道发送过来的信息有多大 byte[] recevieByte = new byte[1024*10]; int len = recevieByte.length; // 接收数据报 DatagramPacket receivePacket = new DatagramPacket(recevieByte, len); // 接收数据 sendSocket.receive(receivePacket); // 获取接收端发送过来的真实长度以及数据 byte[] data = receivePacket.getData(); int length = receivePacket.getLength(); String receiveData = new String(data,0,length); // 获取发送者的IP address = receivePacket.getAddress(); String ip = address.getHostAddress(); System.out.println("接收来自:"+ip+"的数据,内容是:"+receiveData); // 关闭资源 sendSocket.close(); } } 

代码如下(接收端):

import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class RecevieMessage { public static void main(String[] args) throws Exception { // 接收消息的端口(与发送端保持一致) int port = 12345; DatagramSocket recevieSocket = new DatagramSocket(port); // 设置缓冲区接收发过来的信息 byte[] receiveByte = new byte[1024*10]; int len = receiveByte.length; // 接收数据报 DatagramPacket receviePacket = new DatagramPacket(receiveByte, len); // 接收数据 recevieSocket.receive(receviePacket); // 获取实际接收到的数据及其大小 byte[] data = receviePacket.getData(); int length = receviePacket.getLength(); String receiveData = new String(data,0,length); // 获取发送者的IP InetAddress address = receviePacket.getAddress(); String ip = address.getHostAddress(); System.out.println("接收来自:"+ip+"的数据,内容是:"+receiveData); // 接收端接收到信息后发送一条确认接收的消息到发送端 String message = "OK"; byte[] messageByte = message.getBytes(); int messageLength = message.length(); // 从已收到的数据报中获取IP和port address = receviePacket.getAddress(); int port1 = receviePacket.getPort(); //构造新数据报 DatagramPacket sendPacket = new DatagramPacket(messageByte, messageLength, address, port1); // 发送数据 recevieSocket.send(sendPacket); // 关闭资源 recevieSocket.close(); } } 

发送端输出结果:

接收端输出结果:

总结

**注意:**在发送端与接收端启动测试时最好最好先启动接收端,因为这样才能确保信息能发送出去,接收端鞥接收到信息。


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明Java网络编程UDP通信原理
喜欢 (0)

您必须 登录 才能发表评论!

加载中……