Java中的UDP通信
- UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
- Java提供了DatagramSocket类作为基于UDP协议的Socket
构造方法
方法 | 说明 |
---|
DatagramSocket() | 创建数据报套接字并将其绑定到本机地址上的任何可用端口 |
DatagramPacket(byte[] buf,int len,InetAddress add,int port) | 创建数据包,发送长度为len的数据包到指定主机的指定端口 |
相关方法
方法名 | 说明 |
---|
void send(DatagramPacket p) | 发送数据报包 |
void close() | 关闭数据报套接字 |
void receive(DatagramPacket p) | 从此套接字接受数据报包 |
发送数据的步骤
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包
- 调用DatagramSocket对象的方法发送数据
- 关闭发送端
接收端Main的代码
package _receive_server;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Main {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(6666);
DatagramPacket packet = new DatagramPacket(new byte[1024*8],1024*8);
File dir = new File("文件接受夹");
if (!dir.exists()){
dir.mkdirs();
}
socket.receive(packet);
System.out.println("开始接收文件");
byte[] nameData = packet.getData();
int nameLength = packet.getLength();
String fileName = new String(nameData,0,nameLength);
File file = new File(dir,fileName);
file.createNewFile();
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
while (true){
socket.receive(packet);
byte[] data = packet.getData();
int length = packet.getLength();
System.out.println(length);
if (length == 0){
break;
}
os.write(data,0,length);
}
os.close();
System.out.println("文件接收完毕");
}
}
发送端SendDemo的代码
package _receive_server;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendDemo {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\14251\\Pictures\\Screenshots\\屏幕截图(109).png");
DatagramSocket socket = new DatagramSocket(4396);
InputStream inputStream = new FileInputStream(file);
byte[] arr = new byte[1024];
int len;
DatagramPacket packet;
byte[] name = "屏幕截图(109).png".getBytes();
InetAddress ip = InetAddress.getByName("192.168.1.53");
int port = 6666;
packet = new DatagramPacket(name,name.length,ip,port);
socket.send(packet);
while ((len = inputStream.read(arr)) != -1){
packet = new DatagramPacket(arr,len,ip,port);
socket.send(packet);
}
socket.send(new DatagramPacket(new byte[0],0,ip,port));
socket.close();
}
}
运行效果
(先运行接收端,再运行发送端)
首先在本地中创建了“文件接收夹”文件夹
然后把接收到的文件复制到本地当中
到这里使用UDP现实发送端和接收端的功能已经实现,值得注意的是,UDP的缺点,只能发送接收到比较小的文件,像是发送500M左右以上的文件,会发生丢包,使用UDP来实现文件传送无法避免数据丢失(本人还没找到新的方法解决这个问题)。