day16
InetAddress
(网络编程)
构造器不可见,用getLocalHost()获取主机对象
一个域名可以映射多个ip地址 ==》也就是多态服务器;为了避免单点故障
Socket(TCP)
在输出层 《===Tcp\ip协议,客户端套接字, 相当于打电话
客户端和服务器开启是有先后顺序的
先启动服务器 然后启动客户端
- 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的生命周期