• Java网络编程


            大家好久不见了,前面把多线程的一些知识点做了总结学习,从今天开始我们学习Java网络编程的相关知识。加油哦!

    计算机网络就是通过传输介质、通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资源共享和数据传输的系统。 网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。

    TCP/IP协议簇

    TCP/IP协议栈是一系列网络协议的总和,是构成网络通信的核心骨架。

    分层模型

    TCP/IP协议栈的分层模型常见的有2个,分别是TCP/IP参考模型和ISO组织提出的OSI参考模型。

    OSI参考模型是一个开放的通信系统互联参考模型。

    OSI参考模型TCP/IP参考模型对应协议
    应用层应用层http、ftp、telnet、DNS等
    表示层
    会话层
    传输层传输层TCP、UDP
    网络层网络层IP、ICMP、ARP
    数据链路层网络访问层Link
    物理层

     TCP/IP参考模型

    TCP/IP协议采用4层架构,从上向下分为应用层、传输层、网络层和链路层,每一层都可以使用其下一层的协议完成自己的需求,不允许下层访问上层。

    当通过http协议发起一个请求时,从上往下依次通过应用层、传输层、网络层和链路层,每一层相关协议都依次对数据包进行处理,并携带响应的首部,最终在链路层生成以太网数据包,通过物理介质进行传输,传送到对方主机后,对方主机再依次从下向上使用响应协议进行拆包,最终经应用层数据交给应用程序进行处理。

    三次握手:

    TCP是面向连接的协议,连接连接需要有3个阶段:连接建立、数据传送和连接释放。其中连接建立需要经历3个步骤,通常称为三次握手。

     第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认。 

    第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

    四次挥手

    由于TCP连接是双工的,所以每个方向都必须单独进行关闭

     第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段。

    第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。

    第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。 

    第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。


    IP地址

    在网络中定位一个机器需要通过IP地址,IP协议可以分为IPv4IPv6两种,IPv4采用的是点分十进制的计法,例如192.168.1.8。

    Java中提供了一个InetAddress实现对IP地址的封装,子类Inet4AddressInet6Address,这个类一般会和Socket一起使用。

    InetAddress没有公共的构造方法,必须通过使用静态方法获取对应的实例。


    URL编程

    java.net.URL对象用于代表一个网络环境的资源,资源可以是简单的文件或者目录,也可以是复杂对象的引用,例如数据库或者搜索引擎的查询。URL使用协议名、主机名、端口号和资源组成,基本格式为protocol://host:port/resource,由于不同的协议有对应的标准端口号,如果使用标准端口,这个端口号可以省略,http协议的标准端口号为80

            URL统一资源定位器,实际上就是一个资源的指针

            URI统一资源标识符,实际上就是一个URL的名称

            目前考虑到http协议缺少安全机制,很容易被监听;所以引入https协议。https=http+SSL安全套接层,可以实现传输数据的加密,默认端口号443

    1. try{
    2. URL url =new URL("http://campus/banner.jpg");
    3. InputStream is=url.openStream();
    4. OutputStream os=new FileOutputStream(d:/banner.jpg);
    5. byte[] buffer=new byte[8192];
    6. int len=0;
    7. while((len=is.read(buffer))>0){
    8. os.write(buffer,0,len);
    9. }
    10. is.close();
    11. os.close();
    12. }catch(IOException e){
    13. e,printStackTrace();
    14. }

    可以通过URL对象获取访问相关的属性

            String getFile()获取资源名

            String getHost()获取主机名

            String getPath()获取路径部分的名称

            int getPort()获取端口号,如果不能获取则返回-1

    重要方法

    openConnection():URLConnection可以获取输入、输出流

    openStream():InputStream直接获取服务器的响应输出流

    URL与URLConnection区别

    语义上来说:URL代表一个资源的位置,URLConnection代表的是连接。

    Java提供两种读取数据的方法:

            1、通过URL对象直接获取相关的网络信息。

            2、先获取一个 URLConnection实例,然后再得到响应的InputSteamOutputStream,实现数据的读写。

    URL是一种简单直接的方法,但是缺乏灵活性,并且只能读取只读性质的信息;URLConnection提供了非常灵活有效的方法来读取网络资源。

     

  • 相关阅读:
    windows terminal终端美化
    机器学习实战:Python基于LR线性回归进行预测(十)
    ROS学习ROS基础
    Linux下的多线程编程:原理、工具及应用(2)
    什么情况会导致@Transactional事务失效?
    聊一聊 Valgrind 监视非托管内存泄露和崩溃
    老项目的倔强——性能优化篇
    练[FBCTF2019]RCEService
    使用Field_II_ver_3_24_windows_gcc工具箱实现超声波数据成像matlab仿真
    速盾网络:组建CDN服务器加速
  • 原文地址:https://blog.csdn.net/qq_51074048/article/details/125252207