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();
	}
}

  

运行结果

 

posted @ 2021-03-02 15:30  公雪  阅读(241)  评论(0编辑  收藏  举报