java的UDP

java的UDP

  • DatagramSocket 和 DatagramPacket 两个类是 基于UDP 协议进行通信的包装类
  • 实现两个客户端通过 UDP协议通信,使用DatagramSocket 和 DatagramPacket类

案例1:从Send发送数据给Receive,当输入的内容为quit,结束线程

1.发送Send

  • 创建DatagramSocket,随机端口号
  • 创建DatagramSocket,制定数据,长度,地址,端口
  • 使用DatagramSocket发送DatagramPacket
  • 关闭DatagramSocket

2.接收Receive

  • 创建DatagramSocket,制定端口号
  • 创建DatagramPacket,制定数组,长度
  • 使用DatagramSocket接收DatagramPacket
  • 关闭DatagramSocket
  • 从DatagramPacket中获取数据

Send

public class UdpSend2 {
	public static void main(String[] args) throws IOException {
		//1.创建DatagramSocket对象
		DatagramSocket socket = new DatagramSocket();
		//2.从键盘录入
		Scanner sc = new Scanner(System.in);
		while(true) {
			String line = sc.nextLine();
			if("quit".equals(line)) {
				break;
			}
			DatagramPacket packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
			socket.send(packet);
		}
		socket.close();
	}
}

Receive

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceive2 {
	public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket(6666);
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
		while(true) {
			socket.receive(packet);
			byte[] arr = packet.getData();
			int len = packet.getLength();
			String ip = packet.getAddress().getHostAddress();
			int port = packet.getPort();
			System.out.println(ip + ":" + port + ":" + new String(arr, 0, len));
		}
//		socket.close();
	}
}

结果:

Send:

今天是个好天气,适合出去玩!

Receive:

127.0.0.1:54438:今天是个好天气,适合出去玩!

案例2:UDP在多线程中的应用 , 在案例1的基础上使用了线程


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class MoreThread {
	public static void main(String[] args) {
		new Receive().start();
		new Send().start();
	}
}

class Receive extends Thread {
	DatagramSocket socket;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		try {
			socket = new DatagramSocket(6666);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
		
		while(true){
		try {
			socket.receive(packet);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}					//接货
		byte[] arr = packet.getData();			//获取数据
		int len = packet.getLength();			//获取有效的字节个数
		String ip = packet.getAddress().getHostAddress();	//获取ip地址
		int port = packet.getPort();
		System.out.println(ip + ":" + port + ":" + new String(arr, 0, len));
		}
	}
}

class Send extends Thread{
	DatagramSocket socket;
	DatagramPacket packet;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		Scanner s = new Scanner(System.in);						//创建键盘录入对象
		try {
			socket = new DatagramSocket();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			//创建Socket,相当于创建码头
		//创建Packet,相当于集装箱
		while(true){
			String line = s.nextLine();							//获取键盘录入的字符串
			if("quit".equals(line)){
				break;
			}
		try {
			packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
		} catch (UnknownHostException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			socket.send(packet);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		socket.close();
	}
}

结果:

how are you today?
127.0.0.1:60780:how are you today?
i stay at home alone. i am very boring.
127.0.0.1:60780:i stay at home alone. i am very boring.
let's go out paly
127.0.0.1:60780:let's go out paly

发布了54 篇原创文章 · 获赞 0 · 访问量 333

猜你喜欢

转载自blog.csdn.net/qq_42977003/article/details/102997756