InetAddress那些你不知道的秘密

本文深入解析网络编程核心概念,涵盖InetAddress、Socket、TCP与UDP的区别,以及如何通过URL进行资源连接与信息获取。通过实例代码展示客户端与服务端的交互过程,包括数据发送与接收的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

day16

在这里插入图片描述

InetAddress

(网络编程)

构造器不可见,用getLocalHost()获取主机对象

​ 一个域名可以映射多个ip地址 ==》也就是多态服务器;为了避免单点故障

Socket(TCP)

在输出层 《===Tcp\ip协议,客户端套接字, 相当于打电话

客户端和服务器开启是有先后顺序的
先启动服务器 然后启动客户端

  1. ​ client:
    ​ //创建socket对象(ip,端口)
    ​ //获取流对象(你要干嘛?)
    ​ //发送/接受数据信息
    ​ //关闭
    2. server:
    //创建serversocket对象(端口)
    //通过accept方法获取客户端socket对象
    //获取流对象(你要干嘛?)
    //发送/接受数据信息
    //关闭
模拟客户端

client 指定id,端口

public class Test02 {
	public static void main(String[] args) throws UnknownHostException {
		
		//获取一个主机InetAddress对象
		InetAddress in = InetAddress.getLocalHost();
		
		
		//使用对象的方法
		System.out.println("获取ip地址:"+in.getHostAddress());
		System.out.println("主机名称"+in.getHostName());
		byte[] buf = in.getAddress();
		System.out.println(Arrays.toString(buf));
		
		// 获取对象的方法
		InetAddress[] ips = InetAddress.getAllByName("www.baidu.com");
		for(InetAddress ip:ips) {
			System.out.println(ip.getHostAddress()+"=="+ip.getHostName());
		}
		
		
	}
}

模拟服务端 套接字

accept 阻塞方法

public class ServerA {
	public static void main(String[] args) throws IOException {
		
		//1:创建ServerSocket对象
		ServerSocket server = new ServerSocket(10001);// 监听该端口
		
		//2:通过accept方法获取连接的socket对象
		Socket client = server.accept();//阻塞方法
		
		//3:获取客户端发送的数据信息
		InputStream is = client.getInputStream();
		
		//4:读取数据信息
		byte[] buf = new byte[1024];
		int len = is.read(buf);
		
		//5:分析数据
		System.out.println(new String(buf,0,len));		
		//6:关闭资源
		is.close();
		client.close();
		
	}
}

UDP

DatagramSocket(发送,接收);数据报包==》DatagramPacket

不会管接收方是否接收到,相当于短信

public class Send {
	public static void main(String[] args) throws IOException {
		
		//1:创建发送方对象  
		DatagramSocket send = new DatagramSocket(9999);		
		
		//2:构建发送方的数据包对象  buf 
		String str = "老薛已经上线";
		byte[] buf = str.getBytes();
		int len = buf.length;
		InetAddress ip = InetAddress.getLocalHost();
		int port = 10001;//接受方的端口
		DatagramPacket dp = new DatagramPacket(buf, len, ip, port);
		
		
		//3:发送信息
		send.send(dp);
		
	}
}

TCP与UDP区别:

​ 1.基于连接与无连接;
​ 2.对系统资源的要求(TCP较多,UDP少);
​ 3.UDP程序结构较简单;
​ 4.流模式与数据报模式 ;
​ 5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

URL

对于基于http协议下头信息的 获取/设置方法

public class Test04 {
	public static void main(String[] args) throws IOException {
		
		//声明URL对象%E8%8B%8F%E5%B7%9E
		URL url = new URL("http://v.juhe.cn/weather/index?format=2&cityname=%C4%CF%B2%FD" + 
				"&key=ed37c741fc189c1993f14da1833a0f6d");
		
		//通过资源对象获取到连接该资源的链接对象
		URLConnection conn = url.openConnection();
		
		//打开链接
		conn.connect();//建立连接
		
		//读取
		BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
		
		StringBuilder sb = new StringBuilder();
		String str = "";
		while((str=reader.readLine())!=null) {
			sb.append(str);
			sb.append("\r\n");
		}
		
		System.out.println(sb.toString());
	}
}

Connection

存储元素的特点 无序 可重复 对于所有的集合框架中的对象 只能存储引用类型

各种操作:

添加元素

add(Object) 添加元素 返回是否添加成功 true/false

addAll(Coll) 添加一个集合

  • 删除元素

    clear()清空所有元素

    remove()移除一个

    removeAll(Coll) 移除交集

    retainAll(Coll) 保留交集

  • 修改元素

    没有修改元素

  • 查看元素

    isEmpty

    size

    contains

    containsAll

  • 迭代元素

@SuppressWarnings : 注解 用来抑制警告

public class Test01 {
	public static void main(String[] args) {
		
        // 学习接口中的方法  接口指向实现类对象
		Collection coll = new ArrayList();
		//添加元素
		coll.add("java");// Object obj = "java" 自动类型转换
		coll.add(1);// Integer in1 = Integer.valueOf(1);  Object obj = in1;
		
		
		//添加元素
		Collection coll1 = new ArrayList();
		coll1.add("html");
		coll1.add("spring");
		
		System.out.println("往coll中添加coll1:"+coll.addAll(coll1));
		
		//删除元素:
		//coll.clear();
		System.out.println("移除不存在的元素:"+coll.remove("spring"));
		//System.out.println(coll.removeAll(coll1));
		
		System.out.println("coll中的元素:"+coll);
		System.out.println(coll.retainAll(coll1));
		System.out.println("coll中的元素:"+coll);
		
		//查看元素
		System.out.println("查看当前集合是否为null:"+coll.isEmpty());
		System.out.println("查看当前集合元素个数:"+coll.size());
		System.out.println("查看当前集合是否包含元素1:"+coll.contains("1"));
		
	}
}

目前情况下不要再迭代元素过程中强转类型 可能会引发问题 classcaseexception

获取长度

数组.length
字符串length()
集合size()
迭代 iterator

在java.util包中,底层是返回实现 类对象,ArraysList()的方法,内部类

指针指向第一个元素的前面

hasNext()查看是否存在元素,next()移动指针,并且返回当前指针指向的元素

while(it.hasNext()){
    System.out.println(it.next());
}

//变种
for(Iterator it=coll.iterator();it.hasNext();){
    System.out.println(it.next());
}
//缩短了iterator的生命周期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值