• 0302 网络通信


    网络通信协议

      目前网络通信协议应用最广泛的是Tcp/Ip协议,包括Tcp协议和Ip协议,UDP协议和协议组

    IP协议和端口号

      IP协议是用32位二进制的数字组成,4位字节,一个字节代表八位,转成十进制是四个十进制的数组成,每个数字在0-255之间,例:00001010 00000000 00000000 00000001 等于10.0.0.1

      端口号是两个字节,是16位的二进制组成,转成十进制是0-65535范围之内 0~1023之间的端口号用于一些知名的网络服务和应用,用户的普通应用程序需要使用1024以上的端口号

    InetAddress类

      该类中提供了许多关于IP地址相关的方法

      (1)getByName(String name) 返回值是一个InetAddress对象,name代表是自己电脑的名字

      (2)getLocalHost() 返回本地主机 返回值是一个InetAddress对象。

      (3)getHostName() 获取主机名字

      (4)getHostAddress() 获取主机的ip地址

      代码展示

    public class Demo01 {
    
    	public static void main(String[] args) throws UnknownHostException {
    		InetAddress inet=InetAddress.getByName("LAPTOP-T3L09M8L");
    				System.out.println(inet);
    				//获取本机
    		InetAddress inet2=InetAddress.getLocalHost();
    		System.out.println(inet2);
    		//获取主机名
    		System.out.println(inet2.getHostName());
    		//获取ip地址
    		System.out.println(inet2.getHostAddress());
    	}
    }
    运行结果
    LAPTOP-T3L09M8L/192.168.1.185
    LAPTOP-T3L09M8L/192.168.1.185
    LAPTOP-T3L09M8L
    192.168.1.185
    

      

    UDP协议和TCP协议

      1、UDP 无连接通信协议,即在数据传输时,不建立逻辑连接关系,也就是说发送端不知道接收端在不在 就发送数据,同样接收端接收到数据也不会发出接收到数据的信息。

      UDP消耗资源小,通信效率高,通常应用于音频视频的数据传输,例如视频会议,偶尔卡一下,不会造成数据的丢失。

      由于UDP是无连接的 所以在传输数据时并不能保证数据的完整性,所以在传输重要文件的时候不建议使用UDP传输。

      2、TCP协议,是面向链接的通信协议,在发送端和接收端建立逻辑链接关系,保证数据准确无误的传输。TCP传输必须明确客户端和服务器端,客户端发出请求,每次创建链接都要经过 三次握手

      第一次握手:当客户端发出请求等待服务器应答,第二次握手:服务器收到请求,并发出响应,第三次握手:客户端收到响应后再次发出确认信息,最后建立链接

    UDP通信

    这样写UDP发送数据的程序呢

    提供了DatagramPacket打包拆包类,和DatagramSocket 运输发送和接受的类

    DatagramPacket构造方法

      DatagramPacket(byte[] buf, int length)用于接收ilength长度的数据包

      DatagramPacket(byte [] buf, int 1 ength, InetAddress address, int Dort)将length长度的数据包,发送给address主机,Dort端口号

    DatagramPacket常用拆包方法

      getAddress()返回主机的Ip地址

      getPort()返回端口号

      getLength()返回数据的长度

    DatagramSocket 构造方法

      DatagramSocket ()用于发送端

      DatagramSocket (int Dort)用于接收端

    代码展示 发送端

    public class UDPSend {
    
    	//发送端
    	public static void main(String[] args) throws IOException {
    		byte[] bytes="你好".getBytes();
    		InetAddress inet=InetAddress.getLocalHost();
    		//创建数据打包对象 封装发送的数据地址 接收端ip和端口号
    		DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,9000);
    		//创建快递公司对象
    		DatagramSocket ds=new DatagramSocket();
    		//发送数据
    		ds.send(dp);
    		//释放资源
    		ds.close();
    	}
    }
    

      

    接收端

    public class UDPResive {
    
    	//接收端
    	public static void main(String[] args) throws IOException {
    		//创建快递公司明确端口号
    		DatagramSocket ds=new DatagramSocket(9000);
    		//创建字节数组接受数据
    		byte[] bytes=new byte[1024];
    		//创建拆白对象
    		DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
    		//接受数据
    		ds.receive(dp);
    		//拆包
    		//获取发送端ip地址
    		String ip=dp.getAddress().getHostAddress();
    		//获取发送端端口号
    		int port=dp.getPort();
    		//获取数据长度
    		int len=dp.getLength();
    		System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"+new String(bytes,0,len));
    		ds.close();
    	}
    }
    

      

    创建循环发送输入的内容

    public class UDPSend {
    
    	//发送端
    	public static void main(String[] args) throws IOException {
    		Scanner sc=new Scanner(System.in);
    		InetAddress inet=InetAddress.getByName("192.168.1.171");
    		//创建快递公司对象
    		DatagramSocket ds=new DatagramSocket();
    		while(true){
    			byte[] bytes=sc.next().getBytes();
    			//创建数据打包对象 封装发送的数据地址 接收端ip和端口号
    			DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,9000);
    			//发送数据
    			ds.send(dp);
    		}
    		//释放资源
    		//ds.close();
    	}
    }
    
    public class UDPResive {
    
    	//接收端
    	public static void main(String[] args) throws IOException {
    		//创建快递公司明确端口号
    		DatagramSocket ds=new DatagramSocket(9000);
    		//创建字节数组接受数据
    		byte[] bytes=new byte[1024];
    		while(true){
    		//创建拆白对象
    		DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
    		//接受数据
    		ds.receive(dp);
    		//拆包
    		//获取发送端ip地址
    		String ip=dp.getAddress().getHostAddress();
    		//获取发送端端口号
    		int port=dp.getPort();
    		//获取数据长度
    		int len=dp.getLength();
    		System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"+new String(bytes,0,len));
    		}
    		//ds.close();
    	}
    }
    

      

    运行结果

  • 相关阅读:
    Siege 3.0 正式版发布,压力测试工具
    Pomm 1.1.2 发布,专为 PG 设计的 ORM 框架
    Whonix 0.5.6 发布,匿名通用操作系统
    国内开源 java cms,Jspxcms 2.0 发布
    EZNamespaceExtensions.Net v2013增加对上下文菜单、缩略图、图标、属性表的支持
    GNU Guile 2.0.9 发布,Scheme 实现
    jdao 1.0.4 发布 轻量级的orm工具包
    OpenSearchServer 1.4 RC4 发布
    Percona Server for MySQL 5.5.3030.2
    Samba 4.0.5 发布
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14469200.html
Copyright © 2020-2023  润新知