网络相关
分组交换网
ISO OSI/RM ---> TCP/IP模式 --->Internet
浏览器
应用层 ---> 自定义协议/HTTP/XMPP/QQ/ICQ/SMTP/POP3/Telnet
传输层 ---> 端到端通信 - TCP/UDP - 套接字
网络层(IP) ---> 寻址和路由 - IP地址
物理链路层 ---> 电气特性、
协议 - 通信双方对方的标准和规范
HTTP -超文本传输协议 - Hyper-Text Transfer Protocol
HTTP请求
GET - 从服务器获取资源
POST - 向服务器提交数据
请求行 --> 命令 资源路径/资源名称 HTTP/1.1\r\n
请求头 --> 多组 键:值
\r\n
消息体(可以为空)
HTTP响应
响应行 --> HTTP/1.1 状态码
响应头 --> 多组 键:值
\r\n
消息体
text/html ---> HTML书写的网页
text/xml ---> 以XML格式表示的数据
对于移动客户端绝大数是以下形式
application/json ---> 以JSON格式表示的数据
HTML - Hyper-Text Markup Language
标签 --- 内容 H5
样式表 --- 显示 CSS3
JavaScript --- 行为 ECMA6 ---> Ajax
XML eXtensible Markup Language
JSON - JavaScript Object Notation
{"from":"Kygo","to":"Jack","message":"晚上你请我吃饭"}
URL - Universal Resource Locator
统一资源定位符 - 唯一标记某一个资源
http://www.baidu.com:80/index.html
http://180.93.33.108:80/index.html
协议://域名或者IP地址:端口/路径/资源名称[?查询字符串]
参数名1=参数值1&参数名2=参数值2
DNS - 域名服务 - 将域名转换成IP地址
端口 - 对IP地址的一个扩展 - 用于区分不同的服务
JSON解析工具 - jackson/gson/fastjson
分层是设计负责系统时必然要考虑的一件事情
表示层
业务层
持久层
每日要点
软引用和弱引用
如果一个对象有强引用引用它 那么一定不会被GC掉
如果一个对象有软引用引用它 那么在内存不足时就会被GC掉
如果一个对象有弱引用引用它 那么在发生垃圾回收时就会被GC掉
通常软引用和弱引用是用来实现对象缓存功能的
一般也不会直接使用SoftReference和WeakReference类
而是使用一个叫做WeakHashMao的容器
WeakHashMap中的键是以弱引用方式持有的
键值对中的键所引用的对象被释放后会自动移除对应的键值对组合
此项功能最适合用来设计对象缓存(容器中持有可留可不留的对象)
例子1:
class Shit {
// 当垃圾回收器回收Shit对象时可能会调用该方法
@Override
protected void finalize() throws Throwable {
System.out.println("狗屎没了!!!");
}
}
class Test01 {
// 如果一个对象有强引用引用它 那么一定不会被GC掉
// 如果一个对象有软引用引用它 那么在内存不足时就会被GC掉
// 如果一个对象有弱引用引用它 那么在发生垃圾回收时就会被GC掉
// 通常软引用和弱引用是用来实现对象缓存功能的
// 一般也不会直接使用SoftReference和WeakReference类
// 而是使用一个叫做WeakHashMao的容器
// WeakHashMap中的键是以弱引用方式持有的
// 键值对中的键所引用的对象被释放后会自动移除对应的键值对组合
// 此项功能最适合用来设计对象缓存(容器中持有可留可不留的对象)
public static void foo() {
Shit shit = new Shit();
System.out.println(shit);
// shit = null;
// ...
}
public static void main(String[] args) {
foo();
System.out.println("hello");
System.gc();
}
}
例子2:
class Shit {
@Override
protected void finalize() throws Throwable {
System.out.println("狗屎没了!!!");
}
}
class Test02 {
public static void foo() {
Shit shit = new Shit();
System.out.println(shit);
}
public static void main(String[] args) throws Exception {
List list = new ArrayList<>();
System.out.println("=====第1坨=====");
foo();
System.gc();
Thread.sleep(2000);
System.out.println("=====第2坨=====");
// 强引用
// Shit shit = new Shit();
// 弱引用
WeakReference weakShit = new WeakReference(new Shit());
int i = 0;
while (true) {
if (weakShit.get() == null) {
System.out.println(list.size());
System.out.println("Object has been collected.");
break;
}
else {
i += 1;
list.add(String.valueOf(i));
// System.out.println(Runtime.getRuntime().freeMemory());
// System.out.println(i + ": " + weakShit);
}
}
}
}
HTTP网络编程
基于HTTP协议访问服务器
- 1.创建统一资源定位符对象
- 2.基于URL对象创建连接对象
- 3.设置请求行中的请求方法
- 4.设置请求头
json解析
使用Gson第三方库将字符串将服务器返回的JSON格式的字符串处理成对象模型
通过JsonParser对象的parse()方法将字符串转成JsonElement
通过Gson对象的fromJson()方法将JsonElement转换成自定义类型的对象
例子1:百度apis.store中的身份证识别
class PersonInfo {
private String address;
@SerializedName("sex")
private String gender;
private String birthday;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
class IdcardModel {
// private int errNum;
// private String retMsg;
@SerializedName("retData")
private PersonInfo info;
public PersonInfo getInfo() {
return info;
}
public void setInfo(PersonInfo info) {
this.info = info;
}
}
class Test03 {
public static void main(String[] args) {
URLConnection connection = null;
try {
// 基于HTTP协议访问服务器
// 1.创建统一资源定位符对象
// http://www.baidu.com:80/index.html
// http://180.93.33.108:80/index.html
// 协议://域名或者IP地址:端口/路径/资源名称[?查询字符串]
// 参数名1=参数值1&参数名2=参数值2
// 如果查询字符串中有不允许在URL中出现的字符(例如:中文)
// 这些字符需要转换成百分号编码
URL url = new URL("http://apis.baidu.com/apistore/idservice/id?id=510623199405100914");
// 2.基于URL对象创建连接对象
connection = url.openConnection();
// 设置请求行中的请求方法
((HttpURLConnection) connection).setRequestMethod("GET");
// 设置请求头
connection.setRequestProperty("apikey", "2fa58657897cc7c76740406af043b75d");
connection.connect();
InputStream in = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
StringBuilder sb = new StringBuilder();
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
// 使用Gson第三方库将字符串将服务器返回的JSON格式的字符串处理成对象模型
// 通过JsonParser对象的parse()方法将字符串转成JsonElement
JsonElement elem = new JsonParser().parse(sb.toString());
// 通过Gson对象的fromJson()方法将JsonElement转换成自定义类型的对象
IdcardModel model = new Gson().fromJson(elem, IdcardModel.class);
PersonInfo info = model.getInfo();
System.out.println(info.getAddress());
System.out.println(info.getGender());
System.out.println(info.getBirthday());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
((HttpURLConnection) connection).disconnect();
}
}
}
}
中文转百分号编码
将中文转换成百分号编码(URL中需要使用百分号编码)
例子:
class Test04 {
public static void main(String[] args) {
String str = "阿萨德";
String str2;
try {
// 将中文转换成百分号编码(URL中需要使用百分号编码)
str2 = URLEncoder.encode(str, "utf-8");
System.out.println(str2);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
作业
作业1:从网站找到相要的数据是json格式转换成
class BeautyNewsInfo {
private String ctime;
private String title;
private String description;
private String picUrl;
private String url;
public String getCtime() {
return ctime;
}
public void setCtime(String ctime) {
this.ctime = ctime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "时间: " + ctime + "\n标题: " + title + "\n介绍: " + description
+ "\n图片地址: " + picUrl + "\n新闻地址: " + url + "\n";
}
}
class News {
private List newslist;
public List getNewslist() {
return newslist;
}
public void setNewslist(List newslist) {
this.newslist = newslist;
}
}
class Test01 {
public static void main(String[] args) {
URLConnection connection = null;
try {
URL url = new URL("https://api.tianapi.com/meinv/?key=bbd3ff83c226c32839cf73363da25f73&num=10");
connection = url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
StringBuilder sb = new StringBuilder();
String temp = null;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
JsonElement elem = new JsonParser().parse(sb.toString());
News news = new Gson().fromJson(elem, News.class);
List newsList = news.getNewslist();
for (BeautyNewsInfo beautyNewsInfo : newsList) {
System.out.println(beautyNewsInfo);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
((HttpURLConnection) connection).disconnect();
}
}
}
作业例子
class GosipNews {
private String title;
@SerializedName("url")
private String detailUrl;
@SerializedName("ctime")
private String pubTime;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetailUrl() {
return detailUrl;
}
public void setDetailUrl(String detailUrl) {
this.detailUrl = detailUrl;
}
public String getPubTime() {
return pubTime;
}
public void setPubTime(String pubTime) {
this.pubTime = pubTime;
}
@Override
public String toString() {
return "标题: " + title + "\n" +
"发布时间: " + pubTime.toString() + "\n" +
"详情链接: " + detailUrl + "\n";
}
}
class NewsModel {
private List newslist;
public List getNewslist() {
return newslist;
}
public void setNewslist(List newslist) {
this.newslist = newslist;
}
}
class Test03 {
public static final String URL = "https://api.tianapi.com/huabian/";
public static final String API_KEY = "772a81a51ae5c780251b1f98ea431b84";
public static List loadDataModel(int num, int page) {
List list = null;
URLConnection connection = null;
try {
String urlStr = String.format(
"%s?key=%s&num=%d&page=%d", URL, API_KEY, num, page);
URL url = new URL(urlStr);
connection = url.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "utf-8");
JsonElement elem = new JsonParser().parse(reader);
NewsModel model = new Gson().fromJson(elem, NewsModel.class);
list = model.getNewslist();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
((HttpURLConnection) connection).disconnect();
}
}
return list;
}
public static void main(String[] args) {
List list = loadDataModel(5, 1);
list.forEach(System.out::println);
}
}