• 网络编程


    CAS算法:

    • 在修改共享数据的时候,把原来的旧值记录下来
    • 如果在内存中的值跟原来的旧值一样,证明没有其他线程操作过内存值,则修改成功
    • 如果内存中的值跟原来的旧值不一样了,证明已经有其他线程操作过内存值了
    • 则修改失败,需要获取现在最新的值,再次进行操作,这个重新获取的就是自旋。
      在这里插入图片描述

    Hsatable
    1、Hashtable采取悲观锁synchronized的形式保证数据的安全性
    2、只要有线程访问,会将整张表全部锁起来,所以Hashtable的效率低下。

    • HashMap线程不安全的,多线程环境下会有数据安全问题
    • Hashtable是线程安全的,但是会将整张表锁起来,效率低下
    • ConcurrentHashMap也是线程安全的,效率较高

    1. 7 ConcurrentHashMap

    在这里插入图片描述

    1. 8 ConcurrentHashMap

    1、如果使用空参构造创建ConcurrentHashMap对象,则什么事情都不做
    在第一次添加元素的时候创建哈希表
    2、计算当前元素应存入的所引
    3、如果该索引位置为null,利用cas算法,将本节点添加到数组中
    4、如果该索引位置不为null,则利用volatile关键字获得当前位置最新的结点地址,挂在他下面,变成链表
    5、当链表的长度大于等于8时,自动转换成红黑树
    6、以链表或者红黑树头结点为锁对象,配合悲观锁保证多线程操作集合时数据的安全性。

    网络编程概述

    网络编程

    • 在网络通信协议,不同计算机运行的程序,可以进行数据传输

    网络编程三要素

    IP地址

    • 设备在网络中的地址,是唯一标识的

    端口

    • 应用程序在设备中唯一标识
    • 一个端口号只能被一个应用程序使用

    端口号:用两个字节表示的整数,它取值0~65535

    其中0~1023之间的端口号用于一些知名的网络服务或者或者应用

    协议

    • 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议
      协议:计算机网络中,连接和通信的规则被称为网络通信协议
      UDP协议
    • 用户数据报协议(User Datagram Protocol)
    • UDP是面向无连接通信协议
      速度快、有大小限制一次最多发送64K,数据不安全,易丢失数据

    TCP

    • 传输控制协议
    • TCP协议是面向连接的通信协议
    • 速度慢、没有大小限制、数据安全

    InetAddress的使用

    为了方便对IP地址的获取和操作,Java提供了一个类InetAnddress
    InetAddress: 此类表示Internet协议(IP)地址

    package com.socketdemo1;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class InetadressDemo1 {
        public static void main(String[] args) throws UnknownHostException {
            InetAddress address = InetAddress.getByName("梅赛德斯");
    
            String hostName = address.getHostName();
            System.out.println("主机名为 ;" + hostName);
    
            String ip = address.getHostAddress();
            System.out.println("IP  "+ip);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    UDP发送端
    在这里插入图片描述

    package com.socketdemo2;
    
    import java.io.IOException;
    import java.net.*;
    
    public class ClientDemo {
        public static void main(String[] args) throws IOException {
            //找码头
            DatagramSocket ds = new DatagramSocket();
    
            //打包礼物
            String s = "送给村长的礼物";
            byte[] bytes = s.getBytes();
    
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 10000;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
    
            //由码头发送包裹
    
            ds.send(dp);
    
            //付钱走羊
            ds.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    UDP接收数据
    在这里插入图片描述

    TCP通信原理
    TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。
    通信之前要保证连接已经建立。
    通过Socket产生IO流来进行网络通信。

    在这里插入图片描述
    TCP发送数据

    package com.socketdemo6;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientDemo {
        public static void main(String[] args) throws IOException {
            //创建一个Socket对象
            Socket socket = new Socket("127.0.0.1", 10000);
            
            //获取一个IO流开始写数据
            OutputStream os = socket.getOutputStream();
            os.write("hello".getBytes());
            
            //释放资源
            os.close();
            socket.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    TCP接收数据

    package com.socketdemo6;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            //创建Socket对象
            ServerSocket ss = new ServerSocket(10001);
            //等待客户连接
            System.out.println(111);
            Socket accept = ss.accept();
            System.out.println(222);
            //获得输入流对象
            InputStream is = accept.getInputStream();
            int b;
            while ((b = is.read()) != -1) {
                System.out.print((char) b);
            }
            //释放资源
            is.close();
            ss.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • accept方法是阻塞的,作用就是等待客户端连接
    • 客户端创建对象并连接服务器,此时是通过三次握手协议保证跟服务器之间的连接
    • 针对客户端来讲,是往外写,所有是输出流
    • 针对服务器来讲,是往里读的,所以是输入流
    • read方法也是阻塞的
    • 在关流的时候,还多了一个往服务器写结束标记的动作
    • 最后一步断开连接,通过四次挥手协议保证连接终止

    三次握手

    在这里插入图片描述

    四次挥手

    在这里插入图片描述

    网络编程:就是可以让两台计算机进行数据交互
    网络编程三要素:
    IP : 设备在网络中唯一标识
    端口号:应用程序在设备中唯一的标识
    协议:数据在传输过程中遵守的规则

  • 相关阅读:
    coding 构建计划添加新的 代码仓库(外部的仓库)
    【面经】2022社招软件测试面试(6)-德科
    【并发编程】并发工具类
    Scanner扫描器类的next方法解析
    照片光晕光学特效模拟调色Boris FX Optics 2024 mac下载安装教程
    C++学习笔记(九)
    jdk1.8批量完成部署
    ATECLOUD测试系统如何检测电机驱动模块
    Flutter:setState() 能在 build() 中直接调用吗?
    ESP8266-Arduino编程实例-MCP9808数字温度传感器驱动
  • 原文地址:https://blog.csdn.net/pilipala_biu/article/details/126320592