网络编程

网络编程

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张图片

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 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;
	}

}

你可能感兴趣的:(网络编程)