socket(三)–udp同步阻塞式
文章目录
一、简介
udp是无状态的,不需要事先建立连接,发送报文也是不安全的,即不保证一定发送到,也不保证按顺序送到。同时因为无连接,相应的开销小,速度快,可用于视频、语音等对实时性要求高,数据完整性要求不高的场景。这里对在java中阻塞式的udp通信进行介绍。
二、关键类
2.1、java.net.DatagramSocket
客户端和服务端都使用的socket,通常服务端需要指定端口,客户端可由机器自动分配。
2.2 java.net.DatagramPacket
报文,发送报文需要指定发送的目的地。接收时不需要指定地址。
三、示例
3.1 服务端代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;
public class UdpServer {
public static void main(String[] args) throws Exception {
//生成服务端datagram socket, 绑定端口
DatagramSocket socket = new DatagramSocket(6001);
Scanner scanner = new Scanner(System.in);
while (true) {
//接收消息
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println("receive msg:" + msg);
//发送消息,发送地址来自接收报文
System.out.print("send msg:");
String writeMsg = scanner.nextLine();
packet.setData(writeMsg.getBytes());
socket.send(packet);
}
}
}
3.2 客户端代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class UdpClient {
public static void main(String[] args) throws Exception {
//生成客户端datagram socket,端口自定义
DatagramSocket socket = new DatagramSocket();
//指定发送目的地
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 6001);
Scanner scanner = new Scanner(System.in);
while (true) {
//发送消息
System.out.print("send msg:");
String msg = scanner.nextLine();
byte[] writeBytes = msg.getBytes();
//报文中指定发送地址
DatagramPacket writePacket = new DatagramPacket(writeBytes, writeBytes.length, address);
socket.send(writePacket);
//接收消息
byte[] readbytes = new byte[1024];
DatagramPacket readPacket = new DatagramPacket(readbytes,readbytes.length);
socket.receive(readPacket);
String readMsg = new String(readPacket.getData(), 0, readPacket.getLength());
System.out.println("receive msg:" + readMsg);
}
}
}