Java之网络编程(二)UDP

/**
 * 在java中网络通讯也称作为Socket(套接字)通讯,要求通讯的两台机器都必须安装Socket
 * 不同的协议有不同的Socket
 * 
 * UDP通讯协议的特点:
 * 1.将数据及其原源和目的封装为数据包,不需要建立连接
 * 2.每个数据包大小限制在64k
 * 3.因为无连接,所以不可靠
 * 4.因为不需要建立连接,所以速度快
 * 5.UDP通讯是不分服务端与客户端的,只分发送端与接收端
 * 如:人说话、CS等
 * 
 * TCP通讯协议的特点:
 * 1.面向连接,有特有的通道
 * 2.在连接中传输大数据量
 * 3.通过三次握手机制连接,可靠协议
 * 4.通信前必须建立连接,效率稍低
 * 如:打电话、文件的传送
 * 
 * UDP协议下的Socket:
 * DatagramSocket(UDP插座服务)
 *  DatagramPacket(数据包类)
 *   DatagramPacket(buf, length, address, port)
 *     buf:发送的是数据内容
 *     length:发送数据内容大小
 *       address:发送的目的IP地址对象
 *       pprt:端口号
 * 

 * */

一、实现接收端接收数据,发送端发送数据

package com.shuhuadream.udp;

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

//UDP 接收端 接收数据
public class MyReceiver {
	public static void main(String[] args) {
		
		try {
			//1.创建接收端对象
			DatagramSocket socket = new DatagramSocket(6565);
			//2.创建byte数组容器,封装为数据包用于存放数据
			byte[] buf = new byte[1024];
			DatagramPacket packet = new DatagramPacket(buf,buf.length);
			//3.调用UDP的服务接收数据
			socket.receive(packet);//receive是一个阻塞方法,没有接收到数据一直继续等待,数据实际上就是存储到了byte的字节数组中
			//4.处理数据
			System.out.println("发送端传来的数据:"+new String(buf,0,packet.getLength()));
			//5.关闭资源
			socket.close();
			
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
package com.shuhuadream.udp;

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

//UDP 发送端 发送数据
public class MySender {
	
	public static void main(String[] args) {
		
		try {
			//1.创建发送端发送对象
			DatagramSocket socket = new DatagramSocket(7777);
			//2.准备数据,并将数据封装到数据包内
			String msg = "生当作人杰,死亦为鬼雄";
			byte[] data = msg.getBytes();
			DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),6565);
			//3.调用udp服务发送数据包
			socket.send(packet);
			//4.关闭资源--实际上是释放占用的端口号
			socket.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

运行结果:

二、实现发送端单项多次给接收端发送信息

package com.shuhuadream.udp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

//发送端
public class ChatSender {
	public static void main(String[] args) {
		
		try {
			//创建发送端对象
			DatagramSocket socket = new DatagramSocket(2443);
			//明确要发送的数据
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			while(true){
				String line = br.readLine();
				byte[] data = line.getBytes();
				//将数据打包
				DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getByName("10.41.151.14"),6565);
				//发送数据
				socket.send(packet);
				if(line.equals("bye")){
					break;
				}
			}
			//关闭发送端资源
			br.close();
			socket.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package com.shuhuadream.udp;

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

//接收端
public class ChatReceiver {
	public static void main(String[] args) {
		
		try {
			//1.创建接收端对象
			DatagramSocket socket = new DatagramSocket(6565);
			//2.创建byte数组容器,封装为数据包用于存放数据
			byte[] buf = new byte[1024];
			while(true){
				DatagramPacket packet = new DatagramPacket(buf,buf.length);
				//3.调用UDP的服务接收数据
				socket.receive(packet);
				//4.处理数据
				System.out.println(packet.getAddress().getHostAddress()+":"+new String(packet.getData(),0,packet.getLength()));
			}
//			//5.关闭资源
//			socket.close();
			
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}


三、开启线程实现两个客户端之间能够聊天

package com.shuhuadream.udp2;

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 UDPSendThread extends Thread{
	private DatagramSocket socket;	//发送端对象
	private InetAddress address;	//目标地址
	private int port;				//端口号
	
	
	public UDPSendThread(DatagramSocket socket, InetAddress address, int port) {
		super();
		this.socket = socket;
		this.address = address;
		this.port = port;
	}


	public void run() {
		//获取要发送的数据
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while(true){
			try {
				String line = br.readLine();
				byte[] data = line.getBytes();
				//将数据打包
				DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
				//发送数据
				socket.send(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
package com.shuhuadream.udp2;

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

public class UDPReceiverThread extends Thread{
	private DatagramSocket socket;//接收端对象

	public UDPReceiverThread(DatagramSocket socket) {
		super();
		this.socket = socket;
	}
	
	@Override
	public void run() {
		while(true){
			//准备容器,封装为数据包用于存放数据
			byte[] buf = new byte[1024*16];
			DatagramPacket packet = new DatagramPacket(buf,buf.length);
			try {
				//接收数据
				socket.receive(packet);
				//处理数据
				System.out.println(packet.getAddress().getHostAddress()+":"+new String(packet.getData(),0,packet.getLength()));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
接下来两个客户端都开启接收和发送线程

客户端一:

package com.shuhuadream.udp2;

import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient01 {
	public static void main(String[] args) {
		try {
			DatagramSocket socket = new DatagramSocket(8888);
			InetAddress address = InetAddress.getByName("10.41.151.14");
			//创建发送、接收线程
			UDPSendThread sendThread = new UDPSendThread(socket, address, 4444);
			UDPReceiverThread receiverThread = new UDPReceiverThread(socket);
			//开启线程
			sendThread.start();
			receiverThread.start();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
}

客户端二:

package com.shuhuadream.udp2;

import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient02 {
	public static void main(String[] args) {
		try {
			DatagramSocket socket = new DatagramSocket(4444);
			InetAddress address = InetAddress.getByName("10.41.151.63");
			//创建发送、接收线程
			UDPSendThread sendThread = new UDPSendThread(socket, address, 8888);
			UDPReceiverThread receiverThread = new UDPReceiverThread(socket);
			//开启线程
			sendThread.start();
			receiverThread.start();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
}

实验效果图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦客子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值