UDP:
1 特点:
1.底层基于流的模式,不会去创建连接 ,所以安全性不可靠,但是传送速度块
2.是以数据包的形式进行数据的传输,发送者使用数据包发送,接受者同样使用数据包接收
3.传输的类为DatagramSocket , 数据包为 DatagramPacket
4.一般使用在视频聊天
2.代码实现
发送者:
public class UDPSenderDemo {
public static void main(String[] args) throws IOException {
// InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 2055);
// DatagramSocket ds = new DatagramSocket();
// 创建套接字对象
// 参数为: 要发送的地址 , 端口号
DatagramSocket ds = new DatagramSocket(new InetSocketAddress("127.0.0.1", 2055));
// 数据包 构造方法有接受和发送的
// 参数为: 要发送的byte数组, 要发送的数组长度, 传输类对象
// * length的要求和byte的长度一致
DatagramPacket dp = new DatagramPacket("你好".getBytes(),"你好".getBytes().length,isa);
// 发送数据包
ds.send(dp);
// 闭包
ds.close();
}
}
接受者:
public class UDPReceiverDemo {
public static void main(String[] args) throws Exception {
// 套接字 一直监听发送者的端口号
DatagramSocket ds = new DatagramSocket(2055);
// 创建需要接受的包, 第二个参数为实际所需要的长度
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
// 接受
ds.receive(dp);
// 关流
ds.close();
// 解析数据包
System.out.println(new String(dp.getData(),0,dp.getLength()));
}
}
- *必须先启动接受者,在启动传输者
代码实现简易的聊天(多线程)
public class UDPChatDemo {
public static void main(String[] args) {
new Thread(new Sender()).start();
new Thread(new Receiver()).start();
}
}
// 发送者
class Sender implements Runnable{
DatagramSocket ds;
Scanner sc;
@Override
public void run() {
try {
ds = new DatagramSocket();
sc = new Scanner(System.in);
while(true) {
byte[] b = sc.nextLine().getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length,
new InetSocketAddress("127.0.0.1", 3360));
ds.send(dp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 接受者
class Receiver implements Runnable{
DatagramSocket ds;
DatagramPacket dp;
@Override
public void run() {
try {
ds = new DatagramSocket(3360);
dp = new DatagramPacket(new byte[1024], 1024);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true) {
// 接收数据包
try {
ds.receive(dp);
// 解析
System.out.println(new String(dp.getData(),0,dp.getData().length));
System.out.println(dp.getAddress());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}