IP:地址,类似人的小区
端口:端口号,不通软件的资源,类似房间号
url:统一资源定位符。
TCP/UDP:协议,交流的方式,类似普通话。
OSI七层模型:
TCP./IP四层模型
物理层:比特流
物理层处于OSI的最底层,是整个开放系统的基础。物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传送数据的通路以及传输数据。
数据链路层:数据帧
数据链路层的主要任务是实现计算机网络中相邻节点之间的可靠传输,把原始的、有差错的物理传输线路加上数据链路协议以后,构成逻辑上可靠的数据链路。需要完成的功能有链路管理、成帧、差错控制以及流量控制等。其中成帧是对物理层的原始比特流进行界定,数据链路层也能够对帧的丢失进行处理。
网络层:ip数据报
网络层涉及源主机节点到目的主机节点之间可靠的网络传输,它需要完成的功能主要包括路由选择、网络寻址、流量控制、拥塞控制、网络互连等。
传输层
传输层起着承上启下的作用,涉及源端节点到目的端节点之间可靠的信息传输。传输层需要解决跨越网络连接的建立和释放,对底层不可靠的网络,建立连接时需要三次握手,释放连接时需要四次挥手。
会话层和表示层
会话层的主要功能是负责应用程序之间建立、维持和中断会话,同时也提供对设备和结点之间的会话控制,协调系统和服务之间的交流,并通过提供单工、半双工和全双工3种不同的通信方式,使系统和服务之间有序地进行通信。
表示层关心所传输数据信息的格式定义,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。
应用层
应用层为OSI的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务
数据封装和拆封:
IP认识:用于区分电脑
/**
* IP定位一个节点:计算机,路由
* getLocaLhOST本机
* getByName 根据域名DNS叽叽西IP地址-->IP
*
* 两个额成员犯法:
* 1.getHostAddress:返回地址
* 2,getHostName:返回计算机名称
*/
public class Location {
public static void main(String[] args) throws UnknownHostException {
//使用localhost获取当前主机的地址
InetAddress add=InetAddress.getLocalHost();
System.out.println(add.getHostAddress());
System.out.println(add.getHostName());
//根据域的带netAddress对象
add=InetAddress.getByName("www.baidu.com");
System.out.println(add.getHostAddress());
System.out.println(add.getHostName());
//根据
add=InetAddress.getByName("180.101.49.43");
System.out.println(add.getHostAddress());
System.out.println(add.getHostName());
}
}
端口:虚拟概念,区分程序。
公认端口:0-1023
注册端口:1024-49151
动态/私有端口:49152-65535
查看所有端口:netstat -ano
查看指定端口: netstat -ano|findstr “8080” 获取PID
查看指定进程:tasklist|findstr “8080” 获取程序
/**
* 区分软件
* 2个字节:0-65535
* 同一种协议,端口不能冲突
* 定义端口越大越好
*/
public class PortTest {
public static void main(String[] args) {
InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);
InetSocketAddress socketAddress2=new InetSocketAddress("localhost",9000);
System.out.println(socketAddress.getAddress());
System.out.println(socketAddress2.getAddress());
System.out.println(socketAddress2.getHostName());
System.out.println(socketAddress2.getPort());
}
}
URL(Uniform Resource Locator)
• 统一资源定位符,由4部分组成:协议 、存放资源的主机域名、端口号和资源文件名。
• URL是指向互联网“资源”的指针。
• 资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引 擎的查询
/**
* 统一资源定位符:互联网三大基石质疑(html,http)区分资源
* 1,协议
* 2,域名,计算机
* 3,端口,默认80
* 4,请求资源
*/
public class UrlTest {
public static void main(String[] args) throws MalformedURLException {
URL u = new URL("http://www.baidu.con:80/index.html?cansu=bjsxt#aa");
System.out.println("获取与此url关联的协议的默认端口:"+u.getDefaultPort());
System.out.println("获取与此url关联的协议的默认端口1:"+u.getPort());
System.out.println("getFile:"+u.getFile()); //端口号后面的内容
System.out.println("getPath:"+u.getPath()); //端口号后面的内容
System.out.println("主机名:"+u.getHost()); //www.google.cn
System.out.println("路径:"+u.getPath()); //端口号后,参数前的内容 System.out.println(“端口:”+u.getPort()); //存在返回80.否则返回-1
System.out.println("协议:"+u.getProtocol());
System.out.println("参数部分:"+u.getQuery());
System.out.println("锚点:"+u.getRef());
// URL u = new URL("http://www.abc.com/aa/");
URL u2 = new URL(u,"2.html"); //相对路径构建url对象
System.out.println(u2.toString()); //http://www.abc.com/aa/2.html
}
}
网络爬虫:
1,URL
2,下载1资源
3,分析资源---->正则表达式
4,数据抽取,数据清洗
public class SpiderTest02 {
public static void main(String[] args) throws IOException {
//获取URL
URL url=new URL("https://www.dianping.com/");
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream(),"Utf-8"));
String msg=null;
while((msg=br.readLine())!=null){
System.out.println(msg);
}
br.close();
//分析
//处理
}
}
传输协议:
• TCP(transfer control protocol)
• 一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议 。 • 特点
• 面向连接
• 点到点的通信
• 高可靠性:三次握手
• 占用系统资源多、效率低
• 生活案例
• 打电话
• 应用案例:
• HTTP FTP TELNET SMTP
• UDP(User DatagramProtocol )
• 一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
• 特点:
• 非面向连接,传输不可靠,可能丢失
• 发送不管对方是否准备好,接收方收到也不确认 • 可以广播发送
• 非常简单的协议,开销小
• 生活案例:
• 发送短信 发电报
• 应用案例:
• DNS SNMP
套接字Socket
• 我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层 的服务呢?在应用层和传输层之间,则是使用套接字来进行分离。
• 套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者 接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出
来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次的工作
UDP:DatagrmPacket
/**
* 接收端
* 1,使用DatagrqmSocket 指定端口,创建接收端
* 2,准备数据,转成字节数组
* 3,封装成DatagramPacket,指定目的地
* 4,阻塞式接收包裹receive(DatagramPacket p)
* 5,分析数据
* byte[] getData()
* getLenth()
* @author lsd
*/
public class UdpServer {
public static void main(String[] args) throws IOException {
System.out.println("发送方准备中");
//1,使用DatagrmSocket 指定端口,创建接收端
DatagramSocket client=new DatagramSocket(8888);
//2,准备数据,转成字节数组
String str="lsd练习网络编程";
byte[] bytes=str.getBytes();
//3,封装成DatagramPacket,指定目的地
DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",9999));
//4,阻塞式接收包裹receive(DatagramPacket p)
client.send(packet);
//5,分析数据
client.close();
}
}
public class UdpClient {
public static void main(String[] args) throws IOException {
System.out.println("接受方准备中....");
//1,使用DatagrmSocket 指定端口,创建接收端
DatagramSocket server=new DatagramSocket(9999);
byte[] contaier=new byte[1024];
DatagramPacket packet=new DatagramPacket(contaier,0,contaier.length);
//3,封装成DatagramPacket,指定目的地
//4,阻塞式接收包裹receive(DatagramPacket p)
server.receive(packet);
//5,分析数据
byte[] datas=packet.getData();
int len=datas.length;
System.out.println(new String(datas,0,len));
server.close();
}
}
tcp:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(8888);
Socket client=server.accept();
System.out.println("一个客户端建立了连接");
DataInputStream dis=new DataInputStream(client.getInputStream());
String data=dis.readUTF();
System.out.println(data);
dis.close();
client.close();
}
}
/**
* 创建客户端
* 1,简历连接:socket创建客户端 +服务器的地址和端口
* 2,操作:输入输出操作
* 3,释放资源
*/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("localhost",8888);
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
String msg="hello";
dos.writeUTF(msg);
dos.flush();
dos.close();
}
}