当前位置: 首页 > news >正文

64.【网络编程】

网络编程

  • 一、基础知识
    • 1.什么是计算机网络?
    • 2.网络编程的目的?
    • 3.如何准确的定位网络上的一台主机?
    • 4.网络通信的要素
    • 5.OSI七层参考模型
    • 二、IP详解
    • 1.IP详解
        • (1).IP的用处:
        • (2).本机IP(localgost)
        • (3).IP的分类
        • (4).域名:
    • 2.Java 获取IP地址
  • 三、端口详解
    • 1.端口
  • 四、通信协议
    • 1.定义
    • 2.TCP/IP协议(一个集合)
    • 3.TCP与UDP的对比
  • (五)、TCP
    • 1.TCP实现聊天的项目
    • 2.TCP上传文件的实现
  • (六)、Tomcat
  • (七)、UDP
    • 1.UDP实现消息发送
    • 2.UDP实现聊天的操作
      • 2.1(未使用多线程单方面输入与单方面输出)
    • 2.2(多线程实现双面的输出)
  • (八)、URL
    • 1.爬取资源包
    • 2.url知识点

一、基础知识

1.什么是计算机网络?

1.定义:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备
,通过通信线路连接起来,在网络操作系统,网络管理软件以及通信协议的管理和
协调下,(实现资源共享和信息传递的计算机系统).

2.网络编程的目的?

1.传递信息
2.数据交换
3.通信

3.如何准确的定位网络上的一台主机?

ping 域名

在这里插入图片描述

1.如何准确的定位网络上的一台主机
(1).本地Ipv4 (cmd >  ipconfig)
(2).端口号
(3).计算机上的某个资源
2.定位了网络上的一台主机,如何传输数据?
(1).javaweb 网页编程  (架构 B/S  >浏览器)
(2).TCP/IP  网络编程   (架构 C/S  >客户端(QQ软件))

4.网络通信的要素

1.如何使新网络的通信
(1).通信双方的地址:  ip 与  端口号
(2).网络通信的协议:  http,ftp,tcp,udp... 
TCP/IP参考模型

5.OSI七层参考模型

在这里插入图片描述

重点学习的是 IP .UDP .TCP
应用层: 比如QQ等,应用
传输层: 比如:通信
网络层: 比如 :封包
数据链路层: 比如:具体传输

二、IP详解

1.IP详解

(1).IP的用处:

唯一定位一台网络上的计算机

(2).本机IP(localgost)

127.0.0.1

在这里插入图片描述

(3).IP的分类

1.通过ip的地址进行分类   
 (1).ipv4地址:
     ipv4 127.0.0.1,四个字节组成,每个字节的长度为0~255,一共42亿个,(2011) 
 (2).ipv6地址:
 	 ipv6           ,128位,8个无符号整数组成
2.通过ip的公网和私网进行分类
(1).公网---互联网
(2).私网---局域网
eg: 192.168.xx.xx 专门给组织内部使用的
(3).ABCD类地址

ABCD类的地址分类: (折半操作)

在这里插入图片描述

(4).域名:

1.主要目的:是为了记忆域名

2.Java 获取IP地址

基本思路:
1.InetAddress 没有构造器不能new 只能进行调用
InetAddress.getByName("www.baidu.com");  //获取域名和地址
2.获取域名(网站)的ip地址
(1).InetAddress.getByName(域名);
3.获取本机的ip地址
(1).InetAddress.getByName("127.0.0.1");
(2).InetAdress.getLocalHost();
package com.Kuangstudy.Net;
import javax.swing.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test {
    public static void main(String[] args) {
        //因为inetAddress是没有构造器的,所以new不了
        try {
            //获得百度的IP地址。
            InetAddress byName_address1 = InetAddress.getByName("www.baidu.com");
            System.out.println("百度 "+byName_address1);
            //
            System.out.println(byName_address1.getAddress());
            //获得规范的名字 也就是ip
            System.out.println(byName_address1.getCanonicalHostName());
            //获得主机的名字 还是ip
            System.out.println(byName_address1.getHostAddress());
            //获得域名
            System.out.println(byName_address1.getHostName());

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

三、端口详解

1.端口

端口表示一个程序的进程;

IP 是家属楼,端口是一户

1.不同的进程有不同的端口号,用来区分软件.
2.端口被规定为0~655353.TCP,UDP: 
每一个都有65535,也就是说一共有 65535*2,单个协议下,端口号不能冲突。TCP与UDP是两个协议
4.端口分类:
(1).公有端口:0~1023;
HTTP :80  HTTPS :443 FTP(远程链接):21 Telent(远程监听) 23 
(2).程序注册端口:1024~49151,分配用户或则程序
Tomcat : 8080 MySQL 3306 Oracle 1521
(3).动态、私有: 49152-65535

查看所有端口

|  端口流
netstat -ano  //查看所有的端口
netstat -ano|findstr "6942"  //查看指定的端口
tasklist|findstr "2460"  //查看2460的端口的进程
基本思路:
1.InetSocketAddress 

2.获取地址
inetSocketAddress_one.getAddress()

3.获取主机名
inetSocketAddress_one.getHostName()

4.获取端口号
inetSocketAddress_one.getPort()
import java.net.InetSocketAddress;

public class Test_InetSocket {
    public static void main(String[] args) {
        InetSocketAddress inetSocketAddress_one = new InetSocketAddress("127.0.0.1", 8080);
        System.out.println(inetSocketAddress_one);
        InetSocketAddress inetSocketAddress_two = new InetSocketAddress("localhost", 8080);
        System.out.println(inetSocketAddress_two);
        //获得主机的地址
        System.out.println(inetSocketAddress_one.getAddress());
        //获得主机的名字(域名)
        System.out.println(inetSocketAddress_one.getHostName());
        //获得主机的端口号
        System.out.println(inetSocketAddress_one.getPort());
    }
}

在这里插入图片描述

四、通信协议

1.定义

网络通信协议:速率,传输码率,代码结构,传输控制.....

2.TCP/IP协议(一个集合)

TCP/IP包括:
重要协议:
1.TCP:用户传输协议
2.UDP:用户数据报协议
....
出名的协议:
1.TCP: 用户传输协议
2.IP:网络互联协议

3.TCP与UDP的对比

TCP :  (eg:打电话 对方可拒绝与不可拒绝)
(1.链接稳定
(2.三次握手,四次挥手
请求连接 同意链接 链接

(3.客户端、服务端
(4.传输完成,释放链接,效率低

UDP : (eg:发短信 对方不能拒绝)
(1).不连接.不稳定
(2.客户端、服务端 (没有明确的界限)
(3.不管有没有准备好,都可以发给你.

三次握手:
1.判断两个事务是否连接上:(至少需要三次回应)
A.你瞅啥?
B:瞅你咋地?
A:打一架?
(…)链接成功

四次分手
1.判断两个事务是否断开连接:(需要四次操作)
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A我真的走了
(…)断开成功

(五)、TCP

1.TCP实现聊天的项目

Socket:  实现两台主句链接点的中间工具。
服务端窗口:
4.获取客户端的端口 通过服务端 套接字
ServerSocket serverSocket = new ServerSocket(9999);
5.等待客户端链接
 Socket socket=serverSocket.accept();
6.读取客户端发送的信息
InputStream is=socket.getInputStream();
7.打印输出
(1).管道流的方法
(2).教学用法
package com.Kuangstudy.Net;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class TcpClientDem0 {
    public static void main(String[] args) throws Exception{
        //1.我得有一份地址

            ServerSocket serverSocket = new ServerSocket(9999);
        //4.等待客户端链接过来
            Socket socket=serverSocket.accept();
         //5.读取客户端的信息
         InputStream is=socket.getInputStream();
         /*
         //6.设置读取得缓冲区
         byte []buf=new byte[1024];
         //7.设置判断得操作
         int count=0;
         //8.开始进行读取
         while ((count=is.read(buf))!=-1){
             System.out.println(new String(buf,0,count));
         }*/

        //管道流实现读取文件信息
        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        //6.设置缓冲区
        byte []buf=new byte[1024];
        int count=0;
        while ((count=is.read(buf))!=-1){
            byteArrayOutputStream.write(buf,0,count);
        }
        System.out.println(byteArrayOutputStream.toString());
        //先开得后关闭
        byteArrayOutputStream.close();
         is.close();
    }
}
客户端窗口:
1.初始化一个IP和端口号
2.创建一个套接字的链接,把IP和端口连接起来
 Socket socket = new Socket(inetAddress,port);
3.利用IO流的输出流进行发送信息
OutputStream os=socket.getOutputStream();

package com.Kuangstudy.Net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

//客户端
public class TcpClientDem1 {
    public static void main(String[] args) throws Exception {

            //1.要知道服务器的地址,和端口号
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port=9999;

           //2.创建一个Socket链接
           Socket socket = new Socket(inetAddress,port);
           //3.发送消息 IO流
           OutputStream os=socket.getOutputStream();
           os.write("你好呀,我是李明".getBytes());
           os.close();
    }
}

管道流的示意图
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.TCP上传文件的实现

客户端:
1.先读取(获得)文件 "123.jpg"(输入流)
2.再写入(输出)服务端文件"123.jpg";(文件输出流)
package com.Kuangstudy.Net;

import java.io.*;
import java.net.Socket;
//客户端

public class TCPDemo1 {
    public static void main(String[] args) throws Exception{
        //1.创建一个Socket链接
        Socket socket=new Socket("127.0.0.1",9000);
        //2.输出信息
        OutputStream outputStream=socket.getOutputStream();
        //3.文件输入流
        FileInputStream fileInputStream=new FileInputStream(new File("src/123.jpg"));//这样写的化是读取本idea下的文件
        //4.读取文件
        byte []buf=new byte[1024];
        int count=0;
        while ((count=fileInputStream.read(buf))!=-1){
            outputStream.write(buf,0,count);
        }

        //通知服务端我接收完毕
        socket.shutdownOutput();

        //客户端来接受信息
        InputStream inputStream_one = socket.getInputStream();
        int count_one=0;
        byte []buf_one=new byte[1024];
        while ((count_one=inputStream_one.read(buf_one))!=-1){
            System.out.println(new String(buf,0,count_one));
        }
        outputStream.close();
        fileInputStream.close();
    }
}

服务端:
1.等待服务端连接创建
2.读取(获得)客户端文件(输出流)
3.写入文件ideal中(文件写入)
package com.Kuangstudy.Net;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
//服务端

public class TCPDemo2 {
    public static void main(String[] args) throws Exception{
        //1.创建服务
        ServerSocket serverSocket=new ServerSocket(9000);
        //2.监听客户端链接
        Socket socket=serverSocket.accept();//阻塞或则监听,一直等待客户端链接 和Scanner一样
        //3.获取输入流
        InputStream inputStream=socket.getInputStream();
        //4.文件输出
        FileOutputStream fileOutputStream=new FileOutputStream(new File("receive.jpg"));
        byte[]buf=new byte[1024];
        int count=0;
        while ((count=inputStream.read(buf))!=-1){
            fileOutputStream.write(buf,0,count);
        }
        //通知客户端我传送完毕了
        OutputStream outputStream_one = socket.getOutputStream();
        outputStream_one.write("我已经传送完毕,服务端已关闭".getBytes(StandardCharsets.UTF_8));
        serverSocket.close();
        inputStream.close();
        fileOutputStream.close();
    }
}


在这里插入图片描述

(六)、Tomcat

服务端:
(1).自定义:(Serve) s
(2).Tomcat服务器(Serve) s
客户端:
(1).自定义:(Customer) c
(2).浏览器:(Broeser)  b
Tomcat 就是指一个服务器,我们可以自定义对服务器进行打开和关闭。

(七)、UDP

就好比如:发短信、发送导弹。(需要知道对方的地址)
1.DatagreamPacket (数据报包)

1.UDP实现消息发送

基本思路:
1.
package com.Kuangstudy.Net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Demo1 {
    public static void main(String[] args) throws Exception{
        //1.开放端口
        DatagramSocket socket=new DatagramSocket(9090);
        //2.接受数据包
        byte []buf=new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length);
        socket.receive(datagramPacket);   //阻塞接受
        System.out.println(datagramPacket.getAddress().getHostAddress());
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        //3.关闭
        socket.close();
    }
}
package com.Kuangstudy.Net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;

public class UDPClient1 {
    public static void main(String[] args) throws Exception {
        //1.建立一个Socket
        DatagramSocket datagramSocket=new DatagramSocket();
        //2.建立一个包
        String string="你好啊,服务器";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port=9090;
        //数据,数据的长度起始 发送给谁
        DatagramPacket datagramPacket = new DatagramPacket(string.getBytes(), 0, string.getBytes().length, localhost, port);
        //3.发送包
        datagramSocket.send(datagramPacket);
        //4.关闭六
        datagramSocket.close();
    }
}

在这里插入图片描述

2.UDP实现聊天的操作

2.1(未使用多线程单方面输入与单方面输出)

在这里插入代码片

发送者

package com.Kuangstudy.Net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//发送者1


public class UDPSenderDmeo1 {
    public static void main(String[] args) throws Exception {
        DatagramSocket datagramSocket=new DatagramSocket(8888);
        //缓冲数据:  控制台读取System.in
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        while (true){
        //读取一行
        String string_one=bufferedReader.readLine();
        byte []buf=string_one.getBytes();
        //打包
        DatagramPacket packet=new DatagramPacket(buf,0,buf.length,new InetSocketAddress("localhost",6666));  //发送给谁?
        //发送包
        datagramSocket.send(packet);

        if(buf.equals("bye")){
            break;
        }
        }
        datagramSocket.close();

    }
}

接收者

package com.Kuangstudy.Net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

//接收者1


public class UDPSenderDmeo2 {
    public static void main(String[] args) throws Exception {
        //1.接受的端口
        DatagramSocket datagramSocket=new DatagramSocket(6666);

        while (true) {
            //准备接受包裹
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length );
            datagramSocket.receive(datagramPacket);   //阻塞接受

            //断开连接
            byte []buf_two=datagramPacket.getData();
            //接受的数据
            String string_one=new String(buf_two,0,buf_two.length);
            //打印输出
            System.out.println(string_one.trim());
            if (string_one.trim().equals("bye".trim())){
                break;
            }
        }
        datagramSocket.close();
    }
}

在这里插入图片描述
在这里插入图片描述

2.2(多线程实现双面的输出)

发送者是:学生/接收者是老师
package com.Kuangstudy.Net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//发送者1

public class UDPSenderDmeo1 implements Runnable {

        DatagramSocket datagramSocket=null;
        BufferedReader bufferedReader=null;
        private int fromPort;
        private String toIP;
        private int toPort;
        public UDPSenderDmeo1(){
        }
    public UDPSenderDmeo1( int fromPort, String toIP, int toPort) throws Exception {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        datagramSocket=new DatagramSocket(fromPort);
        bufferedReader=new BufferedReader(new InputStreamReader(System.in));
    }

    @Override
        public void run()  {
        while (true) {
            try {
                //读取一行
                String string_one = bufferedReader.readLine();
                byte[] buf = string_one.getBytes();
                //打包
                DatagramPacket packet = new DatagramPacket(buf, 0, buf.length, new InetSocketAddress(this.toIP, this.toPort));  //发送给谁?
                //发送包
                datagramSocket.send(packet);

                if (buf.equals("bye")) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        datagramSocket.close();
    }
}

发送者是:老师 接收者是:学生
package com.Kuangstudy.Net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

//接收者1


public class UDPSenderDmeo2 implements Runnable {
    private String msgFrom;
    DatagramSocket datagramSocket=null;
    private int port;

    public UDPSenderDmeo2() {
    }
    public UDPSenderDmeo2(int port,String msgFrom) {
        this.msgFrom=msgFrom;
        this.port = port;
        try {
            datagramSocket=new DatagramSocket(port);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while (true) {
            try {
                //准备接受包裹
                byte[] buf = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(buf, 0, buf.length );
                datagramSocket.receive(datagramPacket);   //阻塞接受

                //断开连接
                byte []buf_two=datagramPacket.getData();  //获得数据
                //接受的数据
                String string_one=new String(buf_two,0,buf_two.length);
                //打印输出
                System.out.println(msgFrom+":"+string_one.trim());
                if (string_one.trim().equals("bye".trim())){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        datagramSocket.close();
    }
}

实现发送者是:学生的接口 ,接收者是:老师
import com.Kuangstudy.Net.UDPSenderDmeo1;
import com.Kuangstudy.Net.UDPSenderDmeo2;

public class TalkStudent {
    public static void main(String[] args) throws Exception {
        //开启两个线程
        new Thread(new UDPSenderDmeo1(7777,"localhost",9999)).start();
        new Thread(new UDPSenderDmeo2(8888,"老师")).start();
    }
}
实现发送者是:老师的接口 ,接收者是:学生
import com.Kuangstudy.Net.UDPSenderDmeo1;
import com.Kuangstudy.Net.UDPSenderDmeo2;

public class TalkTeacher_02 {
    public static void main(String[] args) throws Exception{
        new Thread(new UDPSenderDmeo1(5555,"localhost",8888)).start();
        new Thread(new UDPSenderDmeo2(9999,"学生")).start();
    }
}

在这里插入图片描述
在这里插入图片描述

(八)、URL

1.定义:
统一资源定位符:定位资源的,定位互联网上的某一项。
2.协议:      //IP:端口/项目名/资源
3.
(1). DNS 域名解析  www.baidu.com 实质上是:IP

1.爬取资源包

import com.Kuangstudy.Net.UDPSenderDmeo1;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class Demo2 {
    public static void main(String[] args) throws Exception{
        //下载文件
        URL url = new URL("");
        //2.链接此资源
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        //3.
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fileOutputStream=new FileOutputStream("Security.jpg");
        byte []buf=new byte[1024];
        int count=0;
        while ((count=inputStream.read(buf))!=-1){
            fileOutputStream.write(buf,0,count);
        }
        inputStream.close();
        fileOutputStream.close();
        urlConnection.disconnect();
    }
}

2.url知识点

import java.net.URL;

public class Demo1 {
    public static void main(String[] args)throws Exception {
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=liming&password=123");
        System.out.println(url.getProtocol());  //得到协议名
        System.out.println(url.getHost());      //得到主机名
        System.out.println(url.getPort());      //得到端口号
        System.out.println(url.getPath());      //获得文件
        System.out.println(url.getFile());      //全路径
        System.out.println(url.getQuery());     //全参数

    }
}

在这里插入图片描述

"http://dl.stream.qqmusic.qq.com/C400000LQTRH4d6iQO.m4a?guid=3228671748&vkey=32B4FCD4F80B08521BEA1EB37A2AF2B1C6433807F310F20C8F78D52F4976FCC1114EC84B5EEDAE4827FA3928DEB1880E807485D82E7C1760&uin=&fromtag=120032"

相关文章:

  • Python爬虫-网页认识
  • 面试官:深度不够,建议回去深挖
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • 接口测试用例生成工具介绍及应用
  • C#接入 NPOI
  • 面试百问:项目上线后才发现bug怎么办?
  • SpringBoot+Vue实现前后端分离网上药店平台
  • Simulink 自动代码生成电机控制:基于Keil软件集成
  • LQ0103 子串分值【字符串】
  • 数据库实战经验分享(全量表,增量表,拉链表,流水表,快照表)
  • 【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
  • [附源码]Java计算机毕业设计SSM电力公司员工安全培训系统
  • stm32f4xx-ADC
  • Linux命令老是记不住?一篇文章帮你解决。Linux常用命令汇总
  • 基于SPSS的医疗医保费用数据分析预测(C#)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2017年终总结、随想
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Hibernate最全面试题
  • JavaScript异步流程控制的前世今生
  • js
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SwizzleMethod 黑魔法
  • TypeScript实现数据结构(一)栈,队列,链表
  • windows下如何用phpstorm同步测试服务器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 分布式任务队列Celery
  • 讲清楚之javascript作用域
  • 类orAPI - 收藏集 - 掘金
  • 世界上最简单的无等待算法(getAndIncrement)
  • 突破自己的技术思维
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 转载:[译] 内容加速黑科技趣谈
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (分布式缓存)Redis哨兵
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一)基于IDEA的JAVA基础10
  • (转)linux下的时间函数使用
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 8.0 发布到 IIS
  • .NET Core 版本不支持的问题
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 反射的使用
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .考试倒计时43天!来提分啦!
  • @Autowired注解的实现原理
  • [ IO.File ] FileSystemWatcher
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory