InetAddress类
封装了一个IP对象
方法
getAddress():获取此InetAddress对象的IP地址
getLocalHost():返回本地主机
getHostAddress():返回IP地址字符串
getHostName():获取主机名
getAllByName(String host):在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
public class Test01 {
public static void main(String[] args) throws UnknownHostException {
InetAddress in1=InetAddress.getLocalHost();
//使用对象方法
System.out.println("获取IP地址:"+in1.getHostAddress());
System.out.println("获取主机名称:"+in1.getHostName());
byte[] by1=in1.getAddress();
System.out.println(Arrays.toString(by1));
//获取对象方法
InetAddress[] ip1=InetAddress.getAllByName("www.taobao.com");
for(InetAddress ip:ip1) {
System.out.println(ip.getHostAddress()+"==="+ip.getHostName());
}
}
}
TCP协议
基于客户端和服务器,先开启服务器,再开启客户端,这样才能接收到信息。
客户端:socket对象,在创建对象时,要指定IP地址和端口号
服务器:serversocket对象,在创建对象时指定监听的端口,在获取客户端的socket对象时,通过accept方法
- 数据的收发都是通过流完成的,所有的数据信息都可以通过socket获取输入输出流(getInputStream,getOutputStream)
服务器
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//创建Serversocket对象
ServerSocket server1=new ServerSocket(10086);
//通过accept方法获取连接的socket对象
Socket client=server1.accept();
//获取客户端发送消息
InputStream in=client.getInputStream();
//读取信息
byte[] buf=new byte[1024];
int len=in.read(buf);
//分析
System.out.println(new String(buf,0,len));
//关闭资源
in.close();
client.close();
}
}
客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端socket对象
Socket client=new Socket("192.168.101.45",10861);
//创建流对象,发送信息
OutputStream os=client.getOutputStream();
//写信息
os.write("小弟弟".getBytes());
//关闭资源
os.close();
client.close();
}
}
UDP协议
用户数据报,基于发送方和接受方 都是通过DatagrameSocket对象去指定
发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Send {
public static void main(String[] args) throws IOException {
//创建发送对象
DatagramSocket send=new DatagramSocket();
//构建发送包对象
String str="你真帅";
byte[] buf=str.getBytes();
int len=buf.length;
InetAddress in=InetAddress.getLocalHost();
//接收方端口
int port=10001;
DatagramPacket d=new DatagramPacket(buf, len,in,port);
//发送消息
send.send(d);
}
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Recive {
public static void main(String[] args) throws IOException {
//创建接收对象
DatagramSocket r=new DatagramSocket(10001);
//创建接收包对象
byte[] buf=new byte[1024];
DatagramPacket d=new DatagramPacket(buf, buf.length);
//接收信息
r.receive(d);
//分析数据
InetAddress in=d.getAddress();
byte[] buff=d.getData();
int lne=d.getLength();
int port=d.getPort();
String data=new String(buff,0,lne);
System.out.println(in.getHostName()+"==="+data+"===="+port);
}
}
区别
tcp:面向有连接,安全,发送数据无长度限制,发送速度慢
udp:面向无连接,不安全,发送的数据长度有限制,发送速度快,资源消耗小
URL
网址:http://192.168.1.1/login?uname=zhangsan&pwd=123
URL结构:
协议:http
主机:192.168.1.1
端口号:80,默认端口
资源路径:/login (域名后,问号前的称之为资源路径)
请求参数:uname=zhangsan&pwd=123 (问号后的内容)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class Test04 {
public static void main(String[] args) throws IOException {
URL url=new URL("https://www.sina.com.cn/");
//通过资源对象获取到连接该资源的连接对象
URLConnection url1=url.openConnection();
//打开连接
url1.connect();
System.out.println("连接超时设置:"+url1.getConnectTimeout());
System.out.println("获取内容的类型:"+url1.getContentType());
System.out.println("返回内容的长度"+url1.getContentLength());
System.out.println("返回date标头字段的值:"+url1.getDate());
BufferedReader bd=new BufferedReader(new InputStreamReader(url1.getInputStream(),"utf-8"));
StringBuilder s=new StringBuilder();
String str="";
while((str=bd.readLine())!=null) {
s.append(str);
s.append("\n\t");
}
System.out.println(s.toString());
}
}
集合
使用集合的原因:在大多数应用场景中,数据都是动态的,使用数组存储会浪费空间,效率低;而集合框架可以根据不同的应用场景来使用,本质上而言不同的集合对象底层的存储实现方案不同。
迭代器:1.Iterable:java.lang包下的接口,实现改接口就能foreach循环遍历
2.Iterator:java.util包下的接口,迭代器,用来迭代当前集合对象
collection
定义:public interface Collection extends Iterable
方法:
add():添加元素
addAll():添加集合
clear():清空所有元素
remove():删除一个元素
removeAll():移除集合
retainAll():保留集合
isEmpty():是否为空
size():当前集合元素个数
contains():是否包含该元素
containsAll():是否包含集合
import java.util.ArrayList;
import java.util.Collection;
@SuppressWarnings("all") //去除警告
public class Test01 {
public static void main(String[] args) {
Collection coll=new ArrayList();
//添加元素
coll.add("阿锋");
coll.add("方法");
coll.add("fds");
System.out.println(coll);
Collection coll1=new ArrayList();
coll1.add("阿聪");
coll1.add("sjj");
coll.addAll(coll1);
System.out.println(coll);
//删除元素
coll.remove("阿锋");
System.out.println(coll);
//删除集合外的元素
//coll.retainAll(coll1);
//System.out.println(coll);
//删除集合
coll.removeAll(coll1);
System.out.println(coll);
System.out.println("查看是否为空:"+coll.isEmpty());
System.out.println("查看当前集合个数:"+coll.size());
System.out.println("查看当前集合是否包含:"+coll.contains("阿聪"));
System.out.println("查看当前集合是否包含:"+coll.containsAll(coll1));
}
}