Java网络编程之UDP

 UDP User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768UDP的正式规范。

UDP的特征:

  • 不需要建立连接,将数据及相关的地址都封装到数据包中
  • 每个数据包的大小限制在64k
  • 不需要建立连接,所以效率比较高,正因为不需要连接所以是不可靠协议

Socket

  • Socket就是为网络服务提供的一种机制
  • 通信的两端都有Socket
  • 网络通讯其实就是Socket通信
  • 数据在两个Socket间进行传输

Java中使用UDP的步骤

发送端

  1. 建立UDP的socket服务
  2. 封装数据包(指明接收端的IP地址,和接收端的端口号)
  3. 通过socket的Send()发送数据
  4. 关闭服务

接收端

  1. 创建socket服务(需要指明监视的端口号,并且要和发送端指定的接受端口的端口号一致)
  2. 定义数据包用于接收数据(构建DatagramPacket packet用于接收数据)
  3. 通过socket的Receiver()接受数据
  4. 通过packet提供的相应方法获取发送端发送的信息
  5. 关闭服务

代码案例如下

发送端

package cc.enfp.socket.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 SendTest
{
    public static void main(String[] args) throws IOException
    {
	/*
	 * 1、创建socket服务
	 */
	DatagramSocket socket = new DatagramSocket();
	/*
	 * 2、提供相应的发送=信息
	 */
	byte[] data = "开启udp之旅".getBytes();
	//指明接收端的IP地址,和接收端的端口号
	DatagramPacket packet = new DatagramPacket(data, data.length, 
		InetAddress.getLocalHost(), 10000);
	/*
	 * 3、使用socket的发送方法,进行数据的发送
	 */
	socket.send(packet);
	/*
	 * 4、关闭连接,释放资源
	 */
	socket.close();
    }
}

接收端

package cc.enfp.socket.udp;

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

/*
 * UDP 接收端
 */
public class ReceiveTest
{
    public static void main(String[] args) throws Exception
    {
	/*
	 * 1、创建socket服务
	 * 	需要指明监视的端口号,并且要和发送端指定的接受端口的端口号一致
	 */
	DatagramSocket socket = new DatagramSocket(10000);
	/*
	 * 2、构建DatagramPacket packet用于接收数据
	 * 	packet只是为了接受数据,所以只需要指明字节数组和长度就可以
	 */
	byte[] data = new byte[1024];
	DatagramPacket packet = new DatagramPacket(data, data.length);
	/*
	 * 3、通过socket的receive方法将数据封装到packet中
	 */
	socket.receive(packet);//该方法是阻塞
	/*
	 * 4、通过packet提供的相应方法获取发送端发送的信息
	 */
	InetAddress ip = packet.getAddress();
	System.out.println("发送端的IP: "+ip.getHostAddress());
	
	//使用String的重载将返回的byte[]类型的内容转换成字符串
	String content = new String(packet.getData(), 0, packet.getLength());
	System.out.println("发送端发送的内容为: "+content);
	/*
	 * 5.关闭连接,释放资源
	 */
	socket.close();
    }
}



 

转载于:https://my.oschina.net/enfp/blog/652300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值