概述
UDP编程使用DatagramPacket包
1. udp发送接收步骤
发送端
- 建立udpsocket服务
- 将数据封装到数据包
- 使用socket发送数据包
- 关闭资源
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPsend {
public static void main(String[] args) {
try {
System.out.println("client start!!!");
//创建socket,设置发送端端口号
DatagramSocket clientSocket = new DatagramSocket(10003);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramPacket.setAddress(InetAddress.getLocalHost());//设置目的地址(本机)
datagramPacket.setPort(10004);//设置目的端口号
//键盘录入
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
if ("886".equals(line))
break;
byte[] buf = line.getBytes();
datagramPacket.setData(buf);//存入数据到packet
clientSocket.send(datagramPacket);//发送数据
}
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收端
- 定义udpsocket服务,定义一个端口号,数字标识,也就是该接收端应用程序的端口号。
- 定义一个数据包,存储要接收的数据
- 通过socket服务的receive方法接收数据并存储
- 取出数据打印到控制台上
- 关闭资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPreceive {
public static void main(String[] args) {
try {
System.out.println("server start!!!");
//设置接收端端口
DatagramSocket server = new DatagramSocket(10004);
while (true) {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
server.receive(packet);//阻塞等待输入
String receiveData = new String(packet.getData(),0,packet.getLength());
System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + receiveData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. udp使用多线程发送和接收
该代码对上面代码进行了一些优化。
使用两个线程,一个线程作为客户端,另一个线程作为服务端。
效果图:
发送端代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UDPsend implements Runnable {
private DatagramSocket datagramSocket;
public UDPsend(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
try {
System.out.println("发送端已开启请输入:");
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
//创建packet,data放入packet,然后发送
//1.首先创建packet包
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramPacket.setAddress(InetAddress.getLocalHost());//设置目的地址(本机)
datagramPacket.setPort(10005);//设置目的端口号
//2.把数据放入pacekt
String sin = sc.nextLine();//接收到键盘输入字符串
byte[] buf = sin.getBytes();//字符串转换成byte数组
datagramPacket.setData(buf);//数据存入到packet包
//3.发送
datagramSocket.send(datagramPacket);//发送packet数据包
}
} catch (Exception e) {
throw new RuntimeException("send eroooooor");
}
}
}
接收端代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPreceive implements Runnable {
private DatagramSocket datagramSocket;
public UDPreceive(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
@Override
public void run() {
try {
System.out.println("接收端已开启!等待接收");
while (true) {
//创建缓冲区
byte[] buf = new byte[1024];
//创建接收packet用来接收数据
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//使用socket接收packet包
datagramSocket.receive(packet);//阻塞等待接收
//提取packet包中数据存入字符串
String receiveData = new String(packet.getData(), 0, packet.getLength());//数据从0到数据到长度
//打印
System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + receiveData);
}
} catch (Exception e) {
throw new RuntimeException("send eroooooor");
}
}
}
测试开启线程服务
import java.net.DatagramSocket;
public class TestAll {
public static void main(String[] args) {
try {
DatagramSocket ClientSocket = new DatagramSocket(10006);//设置发送端端口号
DatagramSocket ServerSocket = new DatagramSocket(10005);//设计接收端端口号
//开启线程
new Thread(new UDPreceive(ServerSocket)).start();
new Thread(new UDPsend(ClientSocket)).start();
} catch (Exception e) {
throw new RuntimeException("send eroooooor");
}
}
}
总结
以上就是UDP的发送与接收端简单的代码实现,简洁易懂,注释都有详细代码说明。