网络通信协议有很多种, 目前应用最广泛的是 TCP/IP 协议 (Transmission Control Protocal/Internet Protoal 传输控制协议 / 英特网互联协议), 它是一个包括 TCP 协议和 IP 协议, UDP(User Datagram Protocol) 协议和其它一些协议的协议组.
UDP 是无连接通信协议, 即在数据传输时, 数据的发送端和接收端不建立逻辑连接. 在使用 UDP 协议传送数据时, 由于 UDP 的面向无连接性, 不能保证数据的完整性, 因此在传输重要数据时不建议使用 UDP 协议.
TCP 协议是面向连接的通信协议, 即在传输数据前先在发送端和接收端建立逻辑连接, 然后再传输数据, 它提供了两台计算机之间可靠无差错的数据传输. 在 TCP 连接中必须要明确客户端与服务器端, 由客户端向服务端发出连接请求, 每次连接的创建都需要经过 "三次握手". 第一次握手, 客户端向服务器端发出连接请求, 等待服务器确认, 第二次握手, 服务器端向客户端回送一个响应, 通知客户端收到了连接请求, 第三次握手, 客户端再次向服务器端发送确认信息, 确认连接. 由于 TCP 协议的面向连接特性, 它可以保证传输数据的安全性, 所以是一个被广泛采用的协议, 例如在下载文件时, 如果数据接收不完整, 将会导致文件数据丢失而不能被打开, 因此, 下载文件时必须采用 TCP 协议.
前面介绍了 UDP 是一种面向无连接的协议, 因此, 在通信时发送端和接收端不用建立连接.
UDP 通信需要用到两个类 --DatagramPacket 类和 DatagramSocket 类.
DatagramPacket 类用于封装 UDP 通信中发送或者接收的数据.
DatagramPacket 类会用到下面两个方法
DatagramPacket 类 -- 使用这个类的实例对象就可以发送和接收 DatagramPacket 数据包.
这个类用到下面的方法.
UDP 协议就介绍到这, 下面演示文字交互代码(由于只有一台电脑所以用的是本机地址)
发送端
- package com.lty.wangluojianpanluru;
- import java.io.IOException;
- import java.NET.DatagramPacket;
- import java.NET.DatagramSocket;
- import java.NET.InetAddress;
- import java.util.Scanner;
- /*
- * 实现 UDP 协议的发送端
- * 实现封装数据的类 java.NET.DatagramPacket 将数据包装
- * 实现数据传输的类 java.NET.DataGramPacket 将数据包发出去
- *
- * 实现步骤:
- * 1. 创建 DatagramPacket 对象, 封装数据, 接收的地址和端口
- * 2. 创建 DatagramSocket
- * 3. 调用 DatagramSocket 类方法 send, 发送数据包
- * 4. 关闭资源
- *
- * DatagramPacket 构造方法
- * DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- *
- * DatagramSocket 构造方法:
- * DatagramSocket()空参数
- * 方法: send(DatagramPacket d)
- * 文字交互案例思想
- * 实现 UDP 发送, 键盘输入的形式
- * 输入完毕发给接收端
- */
- public class UDPsend {
- public static void main(String[] args) throws IOException{
- Scanner sc=new Scanner(System.in);
- // 创建 DatagramSocket 对象, 数据包的发送和接收对象
- DatagramSocket ds =new DatagramSocket();
- // 创建 InetAddress 对象, 封装自己的 IP 地址
- InetAddress .NET=InetAddress.getByName("127.0.0.1");
- while(true) {
- String message=sc.nextLine();
- // 创建数据包对象, 封装要发送的数据, 接收端 IP, 端口
- byte[] date=message.getBytes();
- DatagramPacket dp=new DatagramPacket(date,date.length,.NET,5000);
- // 调用 ds 对象的方法 send, 发送数据包
- ds.send(dp);
- }
- // ds.close();
- }
- }
接收端
- package com.lty.wangluojianpanluru;
- import java.io.IOException;
- import java.NET.DatagramPacket;
- import java.NET.DatagramSocket;
- /*
- * 实现 UDP 协议的接收端
- * 实现封装数据的类 java.NET.DatagramPacket 将数据包接收
- * 实现数据输出的类 java.NET.DataGramPacket 接收数据包
- *
- * 实现步骤:
- * 1. 创建 DatagramSocket 对象, 绑定端口号
- * 要和发送端端口号一致
- * 2. 创建字节数组, 接收发来的数据
- * 3. 创建数据包对象 DatagramPacket
- * 4. 调用 DatagramSocket 对象方法
- * received(DatagramPacket dp)接收数据, 数据放在数据包中
- * 5. 拆包
- * 发送的 IP 地址
- * 数据包对象 DatagramPacket 方法 getAddress()获取的是发送端的 IP 地址对象
- * 返回值是 InetAddress 对象
- * 接收到的字节个数
- * 数据包对象 DatagramPacket 方法 getLength()
- * 发送方的端口号
- * 6. 关闭资源
- *
- * 文字交互案例思想
- * 实现 UDP 协议的接收端
- * 永不停歇的接收端
- *
- */
- public class UDPReceive {
- public static void main(String[] args) throws IOException{
- // 创建数据包传输对象 DatagramSocket 绑定端口号
- DatagramSocket ds=new DatagramSocket(5000);
- // 创建字节数组
- byte[] data = new byte[1024];
- // 创建数据包对象, 传递字节数组
- while(true) {
- DatagramPacket dp=new DatagramPacket(data,data.length);
- // 调用 ds 对象的方法 receive 传递数据包
- ds.receive(dp);
- // 获取发送端的 IP 地址对象
- String ip=dp.getAddress().getHostAddress();
- // 获取接收到的字节个数
- int length = dp.getLength();
- System.out.println(new String(data,0,length)+"....."+ip);
- }
- // ds.close();
- }
- }
因为无论发送还是接收都不可能只进行一次, 所以会有死循环.
来源: https://www.cnblogs.com/GoodBless/p/11040640.html