网络编程
OSI模型:Open System Interconnection, 开放式网络互联, 由国际化标准组织(ISO)制定的, 是设计和描述计算机网络通信的基本模型
OSI的七层模型:
1.应用层
2.表示层
3.会话层
4.传输层
5.网络层
6.数据链路层
7.物理层
TCP/IP的四层模型
1.应用层: HTTP, FTP, SMTP, DNS
2.传输层: TCP, UDP
3.网络层: ARP, IP
4.物理层
注: Internet就是基于TCP/IP模型
短连接: 当获取到所有数据, 会自动断开连接
长连接: 当建立连接后, 可以频繁的发送数据; 只有强制调用终止, 才能断开连接, 否则一直保持连接
HTTP: 超文本传输协议, 是最常用的协议, 能够建立短连接
TCP: 传输控制协议, 是面向连接的协议; 为通讯的双方提供可靠的数据传输, 并且数据顺序是无差错的
TCP建立连接, 即"三次握手"
1.客户端发送连接到服务器端, 等待服务器端确认
2.服务器端收到客户端的请求, 向客户端回复确认收到
3.客户端收到服务器的确认, 向服务器回复确认收到
TCP断开连接, 即"四次挥手"
1.客户端发起中断请求, 用来关闭客户端到服务器端的连接
2.服务器端收到中断请求, 并回复确认收到
3.服务器端发起中断请求, 用来关闭服务器到客户端的连接
4.客户端收到中断请求, 并回复确认收到
注: 连接是双工连接, 所以要断两个方向的连接
UDP: 数据报文协议, 提供不可靠的数据传输; 把传输的数据分成多个数据包, 每个数据包都包含单独的编码和路由; 从一台机器发送到另一台机器的多个数据包可能选择不同的路由, 也可能按不同的顺序到达
客户端:使用服务的设备 (例如,手机,电脑等)
服务器端提供服务的计算机设备
CS架构: Client-Server 比如:QQ软件–QQ服务器, 王者荣耀–王者荣耀服务器
BS架构: Browser-Server 比如:360浏览器 -服务器, 4399小游戏-服务器
http 超文本传输协议
TCP/UDP 传输层的两种关键协议
InetAddRess:网络地址类
IP地址 网络上主机设备的唯一识别:
IPv4 0.0.0.0 ~ 255.255.255.255
IPv6 0f.0a.0.0.0.0 ~
A: 1.0.0.0~ 127.255.255.255 256的3次方-2
网关 255.0.0.0
B:128.0.0.0~191.255.255.255 256的2次方-2
C:192.0.0.0~ 223.255.255.255 256-2
D:一般都是110开头 用于实验
InetAddRess:网络地址类
获取本机的网络地址
try {
InetAddress local=InetAddress.getLocalHost();
System.out.println(local);
//域名
System.out.println(local.getHostName());
//ip
System.out.println(local.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
获取网站的IP地址
比如:获取huaban网的ip
try {
InetAddress huaban=InetAddress.getByName("www.huaban.com");
System.out.println(huaban);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URL:统一资源定位符,用于代表网络上资源的唯一地址
String str = "https://huaban.com/explore/shouban";
try {
URL url=new URL(str);
System.out.println(url);
//获取协议
System.out.println(url.getProtocol());
//https//http 超文本传输协议!用于数据传输
//获取域名
System.out.println(url.getHost());
//获取端口号 端口的取值范围[0,65535] 注意0-1024是系统端口号
System.out.println(url.getPort());
//文件路径
System.out.println(url.getPath());
/*
* https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%B0%91%E5%B8%85&oq=%25E5%25B0%2591%25E5%25B8%2585%25E4%25BD%25A0%25E8%2580%2581%25E5%25A9%2586%25E5%258F%2588%25E8%25B7%2591%25E4%25BA%2586&rsv_pq=bfd081ee00b6717b&rsv_t=76f4MN%2BFMQSGyfCy%2F0M8ueT85sLx3rAZ0V9sjDI8jnzr3cHKRDB17InZt%2Bw&rqlang=cn&rsv_enter=1&rsv_dl=ts_1&inputT=2313&rsv_sug3=18&rsv_sug1=22&rsv_sug7=100&rsv_sug2=1&prefixsug=%25E5%25B0%2591%25E5%25B8%2585&rsp=1&rsv_sug4=3112&rsv_sug=2
*/
//参数 -1表示没有参数
System.out.println(url.getQuery());
} catch (MalformedURLException e) {
e.printStackTrace();
}
http 超文本传输协议
http网络请求又两种方式
1.get 可以携带得参数量较小
2.post 可以携带大量参数,一般上传,下载文件.都是用post
解析数据还要导入jar包
1.封装get请求
path:路径
parm:参数
public static String getRequest(String path,String parm) {
//1.定义字符串,用于接收网络请求到的数据
String resule="";
//2.设置请求链接
String fullPath=path+"?"+parm;
try {
//3.创建链接对象URL
URL url=new URL(fullPath);
//4.建立连接 获取URLConnection
URLConnection connection = url.openConnection();
//5.获取字节输入流
InputStream inputStream=connection.getInputStream();
//6.把字节流转为字符流
InputStreamReader reader=new InputStreamReader(inputStream);
//7.把字符流转为缓冲字符流
BufferedReader bufferedReader=new BufferedReader(reader);
//8.bufferedReader 是一行一行读取数据的.所以需要把每次读到的数据进行凭借拼接
String line="";
while ((line=bufferedReader.readLine())!=null) {
resule+=line;
}
//关闭流
bufferedReader.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//请求到的数据返回
return resule;
}
做一个get请求,并且解析json格式的数据
package com.http;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class HttpRequest {
public static void main(String[] args) {
/*
*http://api.map.baidu.com/place/v2/search", "query=%E6%B5%B7%E5%BA%95%E6%8D%9E®ion=%E9%83%91%E5%B7%9E&output=json&ak=6E823f587c95f0148c19993539b99295
* 链接中得?,是分割链接路径和连接参数的符号! ?之后都是链接携带的参数,参数不一样服务器收到的数据也不一样就会返回不同的值!
*/
//1.GET请求
String data=getRequest("http://api.map.baidu.com/place/v2/search", "query=%E6%B5%B7%E5%BA%95%E6%8D%9E®ion=%E9%83%91%E5%B7%9E&output=json&ak=6E823f587c95f0148c19993539b99295");
System.out.println(data);
//2.数据解析--封装成一个个的对象
//1.json字符串的最外层是{} 对应JSONObject--> Java中的HashMap
//parseObject(参数1是要解析的字符串,参数2要转为什么类型的)
HashMap hashMap=JSON.parseObject(data, HashMap.class);
//获取results对应的数组
JSONArray jsonArray=(JSONArray) hashMap.get("results");
for (Object object : jsonArray) {
JSONObject jsonObject=(JSONObject) object;
System.out.println(jsonObject.get("name")+" "+jsonObject.get("address"));
}
}
//1.封装get请求
public static String getRequest(String path,String parm) {
//1.定义字符串,用于接收网络请求到的数据
String resule="";
//2.设置请求链接
String fullPath=path+"?"+parm;
try {
//3.创建链接对象URL
URL url=new URL(fullPath);
//4.建立连接 获取URLConnection
URLConnection connection = url.openConnection();
//5.获取字节输入流
InputStream inputStream=connection.getInputStream();
//6.把字节流转为字符流
InputStreamReader reader=new InputStreamReader(inputStream);
//7.把字符流转为缓冲字符流
BufferedReader bufferedReader=new BufferedReader(reader);
//8.bufferedReader 是一行一行读取数据的.所以需要把每次读到的数据进行凭借拼接
String line="";
while ((line=bufferedReader.readLine())!=null) {
resule+=line;
}
//关闭流
bufferedReader.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//请求到的数据返回
return resule;
}
}
2.封装POST请求
public static String postRequest(String path,String parm) {
//POST请求的参数 要求放在请求体中
//1.定义变量 存储请求到的数据
String result="";
try {
//2.创建URL链接对象
URL url=new URL(path);
//3.连接
URLConnection connection=url.openConnection();
//4.post请求需要添加以下代码
//打开输入流和输出流
connection.setDoInput(true);
connection.setDoOutput(true);
//5.关键 把参数写入请求体中
OutputStream outputStream=connection.getOutputStream();
OutputStreamWriter writer=new OutputStreamWriter(outputStream);
//转为缓冲字符流
BufferedWriter bufferedWriter = new BufferedWriter(writer);
//把参数写入缓冲区
bufferedWriter.write(parm);
bufferedWriter.flush();//提交完数据之后
//---------------------------------------
//6.读取服务器返回的数据
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(connection.getInputStream()));
//获取数据
String line="";
while ((line=bufferedReader.readLine())!=null) {
result+=line;
}
//
bufferedReader.close();
bufferedWriter.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
做一个post请求的数据,并且解析
package com.http;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class HttpRequest {
public static void main(String[] args) {
/*
* 客户端和服务器端数据传输得关键方式:http 超文本传输协议
* http网络请求又两种方式
* 1.get 可以携带得参数量较小
* 2.post 可以携带大量参数,一般上传,下载文件.都是用post
*/
/*
*http://api.map.baidu.com/place/v2/search", "query=%E6%B5%B7%E5%BA%95%E6%8D%9E®ion=%E9%83%91%E5%B7%9E&output=json&ak=6E823f587c95f0148c19993539b99295
* 链接中得?,是分割链接路径和连接参数的符号! ?之后都是链接携带的参数,参数不一样服务器收到的数据也不一样就会返回不同的值!
*/
//"http://api.hudong.com/iphonexml.do?type=focus-c";
String postData=postRequest("http://api.hudong.com/iphonexml.do", "type=focus-c");
System.out.println(postData);
//开始解析xml数据
try {
//1.生成文档模型
Document document = DocumentHelper.parseText(postData);
//2.获取根节点
Element rootElement = document.getRootElement();
//3.获取根节点的子节点
Element docList = rootElement.element("docList");
//4.获取所有的docInfo子节点
List<Element> infoList = docList.elements("docInfo");
//5.遍历节点
for (Element element : infoList) {
//.element 获取一个子节点
//.elementText 获取子节点中的文本
System.out.println(element.elementText("docTitle"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
//POST请求
public static String postRequest(String path,String parm) {
//POST请求的参数 要求放在请求体中
//1.定义变量 存储请求到的数据
String result="";
try {
//2.创建URL链接对象
URL url=new URL(path);
//3.连接
URLConnection connection=url.openConnection();
//4.post请求需要添加以下代码
//打开输入流和输出流
connection.setDoInput(true);
connection.setDoOutput(true);
//5.关键 把参数写入请求体中
OutputStream outputStream=connection.getOutputStream();
OutputStreamWriter writer=new OutputStreamWriter(outputStream);
//转为缓冲字符流
BufferedWriter bufferedWriter = new BufferedWriter(writer);
//把参数写入缓冲区
bufferedWriter.write(parm);
bufferedWriter.flush();//提交完数据之后
//---------------------------------------
//6.读取服务器返回的数据
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(connection.getInputStream()));
//获取数据
String line="";
while ((line=bufferedReader.readLine())!=null) {
result+=line;
}
//
bufferedReader.close();
bufferedWriter.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}