Java基础案例教程 第十一章 网络编程 ———11.2 UDP通信

一、DatagramPacket类

JDK提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据

          

 

 

二、DatagramSocket类

DatagramPacket数据报的作用相当于“集装箱”,可以将发送端或者接收端的数据封装起来,

DatagramSocket类的作用类似于“码头”,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,

           

                

 

 

三、UDP网络程序

1、Sender

package cn.itcast.chapter11.example02;
import java.net.*;
/**
 * 发送端
 */
public class Sender {
	public static void main(String[] args) throws Exception {		
		// 1、创建一个DatagramSocket对象
		DatagramSocket ds = new DatagramSocket(3000);
		// 2、要发送的数据
		String str = "hello world";
		byte[] arr = str.getBytes();        // 将定义的字符串转为字节数组
		//3、创建一个要发送的数据包,数据包包括发送的数据,数据的长度,接收端的IP地址以及端口号
		DatagramPacket dp = new DatagramPacket(arr, arr.length, InetAddress.getByName("localhost"), 8954);
		System.out.println("发送信息");
		// 4、发送数据
		ds.send(dp);
		//5、 释放资源
		ds.close();
	}
}

3、Receiver

package cn.itcast.chapter11.example02;

import sun.security.util.Length;

import java.net.*;

/**
 * 接收端
 */
public class Receiver {
	public static void main(String[] args) throws Exception {
		// 1、定义一个DatagramSocket对象,监听的端口号为8954
		DatagramSocket ds = new DatagramSocket(8954);
		// 2、定义一个DatagramPacket对象,用于接收数据
		byte[] buf = new byte[1024]; // 创建一个长度为1024的字节数组,用于接收数据
		DatagramPacket dp = new DatagramPacket(buf, buf.length);

		System.out.println("等待接收数据");
		// 3、等待接收数据,如果没有数据则会阻塞
		ds.receive(dp);
		// 4、调用DatagramPacket的方法获得接收到的信息,包括数据的内容、长度、发送的IP地址和端口号
		byte[] data=dp.getData();   //接收到的数据
		int length=dp.getLength();  //接收数据的长度
		String str =new String(data, 0, length);
		String ip=dp.getAddress().getHostAddress();
		int port=dp.getPort();
		System.out.println(str+" from " + ip + ":" + port); // 打印接收到的信息
		// 5、释放资源
		ds.close();
	}
}

 

注意:

运行Receive.java有时会出现一种异常,如下图:

因为在一台计算机中,一个端口号只能运行一个程序,而我们编写的UDP程序使用的端口号已经被其他程序占用,

遇到这种情况,可以在cmd窗口输入“netstat -anb”命令来查看当前计算机端口占用情况,

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值