_065_Socket之UDP

================

网络编程:不需要基于html页面就可以达到数据之间的传输
网页编程:需要基于html页面上进行数据的交互

网络通讯的三要素
1 IP地址  每个人的身份证
2 端口号  2个不同的软件,一个IP,那么传输数据的时候到底传给谁?就需要端口号,仅仅只是一个标识
3 协议   数据经过路由器的时候,会进行处理,然后发送到另一端,但是另一端的路由器不一样,
   那么如何处理,所以就需要一个公共的协议



IP地址:由一个32位的二进制数据组成,为了方便记忆,把IP地址切成4分,每份8bit,那么2^8,这就是最大的范围
IP地址=网络号+主机号  
经过路由器(非真实IP)       192.168.1.1
子网掩码                           255.255.255.0

255就是表示上面的就是网络号192.168.1   而主机号就是1

IP地址的分类:
A类地址=一个网络号+三个主机号   2^24  政府单位
B类地址=2个网络号+2个主机号      2^16 事业单位(学校,银行)
C类地址=3个网络号+1个主机号      2^8 私人使用


端口号:没有类进行描述,因为它仅仅只是一个标识
端口号的范围:0-65535           
0-1023:系统绑定于一些紧密的服务,不能用   
1024-49151 系统绑定了一些松散的服务,有些可以用
       
3
网络通信协议:
udp通讯协议,将数据及其目的封装为数据包,不需要建立连接
每个数据包大小限制在64K中,因为无连接,所以不可靠,因为不需要建立连接,所以速度快
例:人说话,游戏

tcp通信协议       
面向连接,基于IO流传输。有特有的通道,能传输大数据,通过三次握手机制连接,可靠协议,
因为必须通信前必须建立链接,所以效率稍低
例:电话,文件的传送
       
在java中网络通讯称为Socket(套接字),要求通信的俩台机器都必须安装Socket
   
UDP协议下的Socket:
DatagramSocket(套接字服务,用于发送和接受数据)
DatagramPacket(数据包类,用于包装和解包数据)       
udp通讯不分服务端与客户端,只分发送端和接收端      
       
 每个网络程序都自己所处理的特定格式的数据,如果接收到的数据不符合特定指定的格式,那么就会
被变成垃圾数据丢弃,相当于加密,所以发送的过去要是指定的格式。就和我们的发送封包是一样的,格式肯定要对     

例如飞Q接受的数据格式:(这个格式可以截取封包去看)
version:time:sender:ip:content
   
 在udp协议中,有一个IP地址称为广播地址,广播地址就是主机号为255的地址
 给广播IP地址发送消息的时候,在同一个网络段的机器都可以接受到信息        
 比如 InetAddress.getByName("192.168.1.255")给这个发送信息。这个局域网内所有的机子都会接受到信息
            
 注意:
 1 发送段关闭了端口,那么接收端就不需要       

IntAddress类


 

 static InetAddress[]    getAllByName(String host) 
          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。         
          也可以给IP和域名,比如www.baidu.com,那么就会返回1个IP,但是这个IP有2台主机,所以会返回2个IP
           [www.baidu.com/14.215.177.39, www.baidu.com/14.215.177.38]

getByName 参数可以是主机名也可以是ip地址

 DatagramSocket类,带箭头的是常用方法

recevice 接受数据包,这是一个阻塞的方法,只有端口内有内容发送过来,才会通行

所以先开服务端再开接受端


DatagramPacket类

IP的基本操作

 InetAddress address=InetAddress.getLocalHost(); //返回本地主机对象
 System.out.println(address.getHostAddress()); //返回本机IP地址
 System.out.println(address.getHostName());  //返回ip地址的主机名

 //通过getByName获取主机对象,参数可以填ip或者主机名
 InetAddress address2=InetAddress.getByName("100.65.44.219");
 System.out.println(address2.getHostAddress());
 System.out.println(address2.getHostName());

 //获取主机名(域名)下的所有主机对象
 InetAddress[] address3=InetAddress.getAllByName("www.baidu.com");
 System.out.println(Arrays.toString(address3));

UDP发送端

class Test1
{
	public static void main(String[] args) throws IOException
	{
		//创建Socket通信
		DatagramSocket data = new DatagramSocket();
		String value = getData("This is mine");
		
		//构造包,端口是我们指定的
		DatagramPacket pack = new DatagramPacket(value.getBytes(), value.getBytes().length,
				InetAddress.getLocalHost(),9090);
		
		//发送包过去
		data.send(pack);
		data.close();// 关闭端口
	}

	// 因为要指定的格式,所以下面是组建内容
	public static String getData(String content) throws IOException
	{
		// 例如飞Q接受的数据格式:
		// version:time:sender:ip:content
		StringBuilder sb_1 = new StringBuilder();
		sb_1.append("1.0:");
		// ..........按照格式依次组建
		return sb_1.toString();
	}
}

UDP接收端

public class Test2
{
	public static void main(String[] args) throws IOException
	{
		//接收也用Socket,因为是UDP,所以只要指定端口即可
		DatagramSocket data_1 = new DatagramSocket(9090);
		
		//构建接受包
		byte[] buf = new byte[1024];
		DatagramPacket pack_1 = new DatagramPacket(buf, buf.length);
		
		//接收进包,这是阻塞的方法,
		data_1.receive(pack_1);
		System.out.println(new String(buf, 0, pack_1.getLength()));
		data_1.close();
	}
}


            
           

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82780834