InetAddress的使用、端口和协议、UDP通信发送和接收数据 ...

      最后更新:2022-01-23 13:11:02 手机定位技术交流文章

      目录

        • InetAddress
        • 端口概述
        • 协议概述
          • UDP通信程序
          • UDP聊天室案例

      InetAddress

      概述:方便我们对IP地址的获取操作,Java提供了一个类InetAddress供我们使用

      所在包:java.net
      public class InetAddress 
      extends Object
      implements Serializable
      

      注:InetAddress没有构造函数,需要调用getByName();方法来获得一个InetAddress对象

      常用方法:

      方法名 作用
      static InetAddress getByName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
      String getHostName() 获取此IP地址的主机名
      String getHostAddress() 返回文本显示中IP地址字符串

      代码示例:

      public static void main(String[] args) throws UnknownHostException{
         
      	InetAddresss= InetAddress.getByName("100.64.141.193");      
      	//确定主机名称的IP地址。主机名称也可以是机器名称,也可以是IP地址,推荐写IP地址
      	Stringname= s.getHostName();            //获得此IP地址的机器名称
      	StringIP= s.getHostAddress();           //返回文本显示中的IP地址字符串
      	System.out.println(name);
      	System.out.println(IP);
      }
      

      端口概述

      概述:设备上应用程序的唯一标识
      端口号:

      • 用两个字节表示的整数,它的范围是0-65535之间,其中0-1023之间的端口号一般用户一些知名的网络服务和应用,普通的应用程序需要用1024以上的端口号,如果端口号被另外一个服务应用所占用,会导致当前程序启动失败

      协议概述

      概述:计算机网络中,连接和通信的规划被称为网络通信协议

      1. UDP协议(数据报协议):
        UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不需要建立逻辑连接。简单来说就是,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在就会发送数据,同样接收端在收到数据时也不会向发送端反馈是否收到数据
        (通常用于收音机,视频和普通数据的传输)
      2. TCP协议(传输控制协议):
        TCP协议是面向连接的通信协议,即传数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输

      UDP通信程序

      UDP发送数据的步骤

      1. 创建发送端Socket对象(DatagramSocket)数据报套接字
      2. 创建数据,并把数据打包
      3. 调用DatagramSocket对象的方法发送数据(send()方法)
      4. 关闭发送端

      UDP接收数据的步骤
      接收数据的步骤

      1. 创建接收端的Socket对象(DatagramSocket)
        DatagramSocket(int port)
      2. 创建一个数据包,用于接收数据
        DatagramPacket(byte[] by,int length,InetAddress,int port);
      3. 调用DatagramSocket对象的方法接收数据
        void receive(DatagramPacket p)
      4. 解析数据包,并把数据在控制台显示
        byte[] by=dp.getdata();
        new String(by,0,dp.getLength());
      5. 关闭接收端
        void close()

      代码示例:

      public class SendDemo{
         
      	public static void main(String[] args) throws IOException{
         
      		DatagramSocketds= new DatagramSocket();
      		byte[]by= "asdijhgabsjkhvba".getBytes();
      		DatagramPacketdp= new DatagramPacket(by,by.length,InetAddress.getLocalHost(),10086);
      		//DatagramPacket(byte[] by,int length,InetAddress,int post);
      		ds.send(dp);
      		ds.close();
      	}
      }
      public class ReceiveDemo{
         
      	public static void main(String[] args) throws IOException{
         
      			//DatagramSocket(intport):构造数据报套接字并将其绑定到本地主机上的指定端口
      		DatagramSocketds= new DatagramSocket(10086);
      			//创建一个数据包接收数据
      			//DatagramPacket(byte[]by,intlength):构造一个DatagramPacket用于接收长度为length数据包
      		byte[]by= new byte[1024];
      		DatagramPacketdp= new DatagramPacket(by,by.length);
      		ds.receive(dp);
      			//解析数据包,并把数据在控制台显示
      		byte[]datas= dp.getData();
      		Stringdata= new String(datas);
      			//调用内部类构造方法String(byte[]by,intoff,intlength)
      		System.out.println(new String(dp.getData(),0,dp.getLength()));
      		ds.close();
      	}
      }
      

      UDP聊天室案例

      UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束。
      (用字符缓冲流来做,不要用Scanner)
      UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
      代码示例:

      public class SendDemo{
         
      	public static void main(String[] args) throws IOException{
         
      		BufferedReaderbr= new BufferedReader(new InputStreamReader(System.in));
      		DatagramSocketds= new DatagramSocket();
      		Strings= null;
      		while( (s = br.readLine() ) != null){
         
      			if("886".equals(s)){
         
      				break;
      			}
      			byte[]by= new byte[1024];
      			by=s.getBytes();
      			DatagramPacketdp= new DatagramPacket(by,by.length,InetAddress.getLocalHost(),10086); 
      			 //发送端设置InetAddress(相当于IP)和端口号port
      			ds.send(dp);
      		}
      		br.colse();
      		ds.close();
      	}
      }
      
      public class ReceiveDemo{
         
      	public static void main(String[] args) throws IOException{
         
      			//DatagramSocket(intport):构造数据报套接字并将其绑定到本地主机上的指定端口
      		DatagramSocketds= new DatagramSocket(10086);
      		byte[]by= new byte[1024];
      			//创建一个数据包接收数据
      			//DatagramPacket(byte[]by,intlength):构造一个DatagramPacket用于接收长度为length数据包
      		DatagramPacketdp= new DatagramPacket(by,by.length);
      		while(true){
         
      			ds.receive(dp);
      			byte[]datas= dp.getData();
      				//解析数据包
      			//String data = new String(datas);
      				//调用内部类构造方法String(byte[]by,int off,int length)
      			System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
      		}
      			//ds.close();
      	}
      }
      

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/17189.html

          热门文章

          文章分类