学习笔记之JavaSE(51)--网络编程3

今天学习的内容是UDP传输


无论传输层使用的是UDP协议还是TCP协议,都必须借助socket--套接字的帮助才能进行网络数据传输。UDP传输和TCP传输最大的区别就在于是否需要进行连接,实际上等同于是否需要进行socket连接


Java也对这两种传输协议所使用的socket及相关内容进行了描述,其中UDP传输主要使用DatagramSocket类和DatagramPacket类,DatagramSocket类表示接收和发送数据报包的套接字,DatagramPacket类表示数据报包。UDP传输的基本模式:

  • 接收端:
  • 使用DatagramSocket(port)创建接收数据报包的套接字,并绑定到指定端口此端口标识接收端进程
  • 使用DatagramPacket(buf,length)创建用于接收数据的数据报包
  • 使用DatagranSocket的receive(datagramPacket)方法接收数据报包(阻塞式方法,类似于IO流的读取方法)
  • 发送端:
  • 使用DatagramSocket()创建发送数据报包的套接字,不指定端口(系统会指定任意可用端口来标识发送端进程,并将套接字绑定到此端口)。注意:如果你指定了端口,就不能在一台设备多次运行本进程,因为一个端口不能被多个进程共用!
  • 使用DatagramPacket(buf,length,inetAdress,port)创建用于发送数据的数据报包,将要发送的数据封装到此包中,并指定接收端的IP地址对象与端口号
  • 使用DatagranSocket的send(datagramPacket)方法接收数据报包
注意:套接字没有进行连接,直接传输数据,这就是UDP传输的特点!
示例程序(这里只演示了单向通信):
public class UdpReceive {

	public static void main(String[] args) {

		System.out.println("UdpReceive start....");
		DatagramSocket socket = null;
		DatagramPacket packet = null;
		try {
			socket = new DatagramSocket(5000);// 创建接收数据报包的套接字,并绑定到指定端口(此端口标识接收端进程)
			while (true) {
				byte[] buf = new byte[1024];// 接收数据使用的数组
				packet = new DatagramPacket(buf, buf.length);// 创建用于接收数据的数据报包
				socket.receive(packet);// 接收数据报包--如果没有接收到数据,这个方法是阻塞的
				System.out.println("got a packet");
				// 通过数据报包的方法,解析其中的数据(比如数据内容,发送端的IP地址和端口号等等)
				System.out.println("接收的数据:" + new String(buf, 0, packet.getLength()));
				System.out.println("发送端的IP地址:" + packet.getAddress().getHostAddress());// 10.220.3.122
																						// 发送端IP地址(动态变化的内网IP)
				System.out.println("发送端的端口号:" + packet.getPort());// 54302
																	// 发送端使用的端口号(每次系统指定的端口号都不同!!)
				System.out.println("receive success");
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (!socket.isClosed()) {
				socket.close();
				System.out.println("socket close success");// 如果发生异常就关闭socket
			}
		}
	}
}

public class UdpSend {

	public static void main(String[] args) {

		System.out.println("UdpSend start...");
		DatagramSocket socket = null;
		DatagramPacket packet = null;
		BufferedReader in = null;
		try {
			socket = new DatagramSocket();// 创建发送数据报包的套接字,不指定端口(系统会指定任意可用端口来标识发送端进程,并将套接字绑定到此端口)
			in = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while ((line = in.readLine()) != null) {
				byte[] buf = line.getBytes();// 要发送的数据(用户键盘输入)
				packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 5000);// 创建用于发送数据的数据报包,将要发送的数据封装到此包中
																								// 并指定接收端的IP地址对象与端口号
				socket.send(packet);// 发送数据报包
				System.out.println("send success");
				if (line.equals("tuichu")) {
					break;
				}
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (!socket.isClosed()) {
				socket.close();
				System.out.println("socket close success");
			}
			if (in != null) {
				try {
					in.close();
					System.out.println("in close success");
				} catch (IOException e) {
					System.out.println("关闭资源失败");
				}
			}
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值