UDP通信

/*
*作者:呆萌老师
*☑csdn认证讲师
*☑51cto高级讲师
*☑腾讯课堂认证讲师
*☑网易云课堂认证讲师
*☑华为开发者学堂认证讲师
*☑爱奇艺千人名师计划成员
*在这里给大家分享技术、知识和生活
*各种干货,记得关注哦!
*vx:it_daimeng
*/

  

InetAddress类

IP是网络中存在一个数据,那么Java针对这类特殊的数据,会使用对应的类进行描述、封装。

学习Java中的网络编程,对应的类和接口都在java.net包下:

Java中使用InetAddress类描述封装IP对象。只要在程序中我们需要操作ip地址,只能通过InetAddress对象进行完成。

InetAddress类中没有构造方法,只能通过其中的静态的方法获取到InetAddress对象。

public class TestInetAddress {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			 InetAddress obj=  InetAddress.getLocalHost();//获得本地主机
			 
			 System.out.println(obj.getHostAddress()); //返回主机地址(ip)
			 
			 InetAddress obj2=InetAddress.getByName("www.taobao.com");
			 
			 System.out.println(obj2.getHostAddress());//返回的是ip
			 
			 System.out.println(obj2.getHostName());//返回主机名 www.taobao.com
			 
			 InetAddress[] arr=InetAddress.getAllByName("www.taobao.com");
			 
			 for(InetAddress ipobj:arr)
				 System.out.println(ipobj.getHostAddress());
			 
			 InetAddress obj3=InetAddress.getByName("192.168.1.136");
			
			 System.out.println(obj3.getHostAddress());//192.168.1.136
			 
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

  

UDP通信 

DatagramSocket对象介绍

UDP协议是面向无连接的协议,发送数据的一方尽管发送数据,它不关心接收方是否在接收数据。

在Java中使用DatagramSocket对象表示基于UDP协议的发送端或者是接收端。

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

DatagramPacket对象介绍

数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

DatagramPacket:它本身负责的对基于UDP协议发送或者接收的数据进行打包或者拆包的。

如何区分DatagramPacket对象到底是打包还是拆包的对象:完全依赖创建DatagramPacket对象时调用的构造方法。

代码实现案例

package com.wowowo.udp;

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

public class UdpReceive {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//1.创建码头 接收端的码头需要添加端口号,发送端端口号要跟接收端的端口号一致
		try {
			DatagramSocket datagramSocket=new DatagramSocket(8888);
			
			//2.创建packet 用来接收传递过来的数据
			byte[] data=new byte[1024];
			int length=data.length;
			DatagramPacket datagramPacket=new DatagramPacket(data, length);
			
			//3.接收数据
			datagramSocket.receive(datagramPacket);
			
		    String ip=datagramPacket.getAddress().getHostAddress();
		    
		    String msg=new String(data);
		    
		    System.out.println("接收到来自"+ip+"的信息:"+msg);
		    
		    //4.关闭码头
		    datagramSocket.close();
			
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

  

package com.wowowo.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;

public class UdpSend {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//发送端
		try {
			
			
			//1.创建一个socket(码头)
			DatagramSocket datagramSocket=new DatagramSocket();
			
			//2.创建packet (集装箱)
			byte[] data="呆萌老师你好".getBytes();
			int length=data.length;
			InetAddress ip=InetAddress.getByName("192.168.31.111");
			int port=8888; // 0-1023端口号一般是常用的知名的程序的端口号    65535以内
			
			//DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
			
			DatagramPacket datagramPacket=new DatagramPacket(data, length, ip, port);
			
			//3.发送
			datagramSocket.send(datagramPacket);
			
			//4.关闭码头
			datagramSocket.close();	
			
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}

}

  

 

posted @ 2022-08-04 21:13  呆萌老师  阅读(56)  评论(0编辑  收藏  举报