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{
   
	InetAddress s = InetAddress.getByName("100.64.141.193");      
	//确定主机名称的IP地址。主机名称也可以是机器名称,也可以是IP地址,推荐写IP地址
	String name = s.getHostName();            //获得此IP地址的机器名称
	String IP = 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{
   
		DatagramSocket ds = new DatagramSocket();
		byte[] by = "asdijhgabsjkhvba".getBytes();
		DatagramPacket dp = 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):构造数据报套接字并将其绑定到本地主机上的指定端口
		DatagramSocket ds = new DatagramSocket(10086);
			//创建一个数据包接收数据
			//DatagramPacket(byte[]by,intlength):构造一个DatagramPacket用于接收长度为length数据包
		byte[] by = new byte[1024];
		DatagramPacket dp = new DatagramPacket(by,by.length);
		ds.receive(dp);
			//解析数据包,并把数据在控制台显示
		byte[] datas = dp.getData();
		String data = 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{
   
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		DatagramSocket ds = new DatagramSocket();
		String s = null;
		while( (s = br.readLine() ) != null){
   
			if("886".equals(s)){
   
				break;
			}
			byte[] by = new byte[1024];
			by=s.getBytes();
			DatagramPacket dp = 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):构造数据报套接字并将其绑定到本地主机上的指定端口
		DatagramSocket ds = new DatagramSocket(10086);
		byte[] by = new byte[1024];
			//创建一个数据包接收数据
			//DatagramPacket(byte[]by,intlength):构造一个DatagramPacket用于接收长度为length数据包
		DatagramPacket dp = 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();
	}
}
全部评论

相关推荐

渴望wlb的牛油果很...:直说卡第一学历不就行了 非得拐弯抹角
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务