网络编程

news2025/1/18 17:15:13

网络编程

1.1、概述

在这里插入图片描述
计算机网络:

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

网络编程的目的:

无线电台,传播交流信息

数据交换,通信

想达到的效果:

  1. 如何定位网络主机

    ip,端口,定位到计算机某个资源

  2. 如何传输数据

javaweb: 网页编程 B/S 架构

网络编程: TCP/IP C/S架构 客户端

1.2、网络通信的要素

通信双方的地址:

  • ip
  • 端口号

规则: 网络通信的协议
TCP/IP参考模型:

在这里插入图片描述
小结:

  1. 网络编程中有两个主要的问题

    • 如何准确的定位到网络上的一台或者多台主机。
    • 找到主机之后如何进行通信
  2. 网络编程中的要素

    • IP和端口号 ip

    • 网络通信协议 udp,tcp

  3. 万物皆对象

1.3、IP

ip地址: InetAddress

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

  • 127.0.0.1: 本机localhost

  • ip地址的分类

    • ipv4 / ipv6
      • IPV4 127.0.0.1 ,4个字节组成。, 255,42亿 ; 30亿都在北美,亚洲4亿。
      • ipv6 128位。8个无符号整数!

在这里插入图片描述

  • 公网(互联网)-私网(局域网)

    • ABCD类地址

    • 192.168.xx.xx,专门给组织内部使用的

IPv4 地址:就是自己电脑的本地IP地址

package com.liang.lessonIp;

import java.net.InetAddress;
import java.net.UnknownHostException;

//测试ip
public class TestnetAddress {
    public static void main(String[] args) {
        try {
            //查询本机地址
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            InetAddress localhost = InetAddress.getByName("localhost");
            InetAddress host = InetAddress.getLocalHost();
            System.out.println(localhost);
            System.out.println(host);
            System.out.println(inetAddress);
            //查询网站ip地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2);

            //常用方法
            System.out.println(inetAddress2.getAddress());
            System.out.println(inetAddress2.getHostAddress());//ip
            System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }
}

1.4、端口

端口表示计算机上的一个程序的进程;

  • 不同的进程有不同的端口号!用来区分软件

  • 被规定 0~65535

  • TCP,UDP : 65535* 2 tcp: 80,udp: 80吗,单个协议下,端口号不能冲突

  • 端口分类

    • 公有端口 0~1023

    • http:80

    • HTTPS:443

    • ftp: 21

    • telent: 23

    • 程序注册端口: 1024~49151,分配用户或者程序

      • Tomcat: 8080
      • MysQL: 3306
      • Oracle: 1521
    • 动态、私有:49152~65535

    netstat -ano 查看所有端口

    netstat -ano | findstr “8080” 查看指定端口

    Ctrl+shift+esc

package com.liang.lessonIp;

import java.net.InetSocketAddress;

public class TestInetSocketAddress {
    public static void main(String[] args) {
        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);
        System.out.println(inetSocketAddress);
        System.out.println(inetSocketAddress.getAddress());
        System.out.println(inetSocketAddress.getPort());
    }
}

1.5、通信协议

协议: 约定,就好比我们现在说的是普通话。

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

问题: 非常的复杂?

大事化小: 分层!

TCP/IP协议簇重要:

。TCP : 用户传输协议

。UDP: 用户数据报协议

TcP udp 对比
TCP: 打电话

  • 连接,稳定

  • 三次握手四次挥手

最少需要三次,保证稳定连接!
A: 你瞅啥?
B: 瞅你咋地?
A: 干一场!

四次挥手,断开连接

A: 我要走了
B: 你真的要走了吗?
B: 你真的真的要走了吗?
A: 我的真的要走了

  • 客户端、服务端

  • 传输完成,释放连接,效率低

    UDP : 发短信

    • 不连接,不稳定
    • 客户端、服务端:没有明确的界限。
    • 不管有没有准备好,都可以发给你.
    • 导弹
    • ddos:洪水攻击(饱和攻击)

    1.6、TCP

    先起服务端再起客户端

    客户端:

    1.连接服务器 Socket
    2.发送消息

    package com.liang.lessonIp;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    //客户端
    public class TcpClientDemo1 {
    
        public static void main(String[] args) {
            Socket socket = null;
            OutputStream os = null;
            //1.要知道服务器地址
            try {
                InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2.创建一个socket连接
                 socket = new Socket(inetAddress, port);
                //3.发送消息io流
                 os = socket.getOutputStream();
                os.write("hello world+++梁伟浩".getBytes());
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }finally {
                if (os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                if (socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
    
    
        }
    }
    
    

    服务器:

1.建立服务的端口 ServerSocket

2.等待用户的链接 accept

3.接收用的消息

package com.liang.lessonIp;

import javax.swing.text.StyledEditorKit;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class TcpClientDemo2 {
    public static void main(String[] args) throws IOException {
        //1.我有一个地址
            ServerSocket serverSocket = new ServerSocket(9999);
       //2.等待客户端链接
        Socket accept = serverSocket.accept();
        //3.读取客户端信息
        InputStream is = accept.getInputStream();

        //管道流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer))!=-1){
            baos.write(buffer,0,len);
        }
        System.out.println(baos.toString());

        //关闭资源
        is.close();
        accept.close();
        serverSocket.close();
        baos.close();

    }
}

输出:
D:\JavaEnvironment\jdk1.8\bin\java.exe "-javaagent:D:\工作软件\idea2022\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=52945:D:\工作软件\idea2022\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaEnvironment\jdk1.8\jre\lib\charsets.jar;D:\JavaEnvironment\jdk1.8\jre\lib\deploy.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\cldrdata.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\dnsns.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\jaccess.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\jfxrt.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\localedata.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\nashorn.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunec.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\zipfs.jar;D:\JavaEnvironment\jdk1.8\jre\lib\javaws.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jce.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jfr.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jfxswt.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jsse.jar;D:\JavaEnvironment\jdk1.8\jre\lib\management-agent.jar;D:\JavaEnvironment\jdk1.8\jre\lib\plugin.jar;D:\JavaEnvironment\jdk1.8\jre\lib\resources.jar;D:\JavaEnvironment\jdk1.8\jre\lib\rt.jar;D:\IdeaStudySpace\JavaStudy\target\classes;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-web\2.0.0.RELEASE\spring-boot-starter-web-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter\2.0.0.RELEASE\spring-boot-starter-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot\2.0.0.RELEASE\spring-boot-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-autoconfigure\2.0.0.RELEASE\spring-boot-autoconfigure-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-logging\2.0.0.RELEASE\spring-boot-starter-logging-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\JavaEnvironment\downloadMaven\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\JavaEnvironment\downloadMaven\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;D:\JavaEnvironment\downloadMaven\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;D:\JavaEnvironment\downloadMaven\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\JavaEnvironment\downloadMaven\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\JavaEnvironment\downloadMaven\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-json\2.0.0.RELEASE\spring-boot-starter-json-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\core\jackson-databind\2.9.4\jackson-databind-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\core\jackson-core\2.9.4\jackson-core-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.4\jackson-datatype-jdk8-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.4\jackson-datatype-jsr310-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.4\jackson-module-parameter-names-2.9.4.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-tomcat\2.0.0.RELEASE\spring-boot-starter-tomcat-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\apache\tomcat\embed\tomcat-embed-core\8.5.28\tomcat-embed-core-8.5.28.jar;D:\JavaEnvironment\downloadMaven\org\apache\tomcat\embed\tomcat-embed-el\8.5.28\tomcat-embed-el-8.5.28.jar;D:\JavaEnvironment\downloadMaven\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.28\tomcat-embed-websocket-8.5.28.jar;D:\JavaEnvironment\downloadMaven\org\hibernate\validator\hibernate-validator\6.0.7.Final\hibernate-validator-6.0.7.Final.jar;D:\JavaEnvironment\downloadMaven\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\JavaEnvironment\downloadMaven\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-web\5.0.4.RELEASE\spring-web-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-beans\5.0.4.RELEASE\spring-beans-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-webmvc\5.0.4.RELEASE\spring-webmvc-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-aop\5.0.4.RELEASE\spring-aop-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-context\5.0.4.RELEASE\spring-context-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-expression\5.0.4.RELEASE\spring-expression-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-core\5.0.4.RELEASE\spring-core-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-jcl\5.0.4.RELEASE\spring-jcl-5.0.4.RELEASE.jar com.liang.lessonIp.TcpClientDemo2
hello world+++梁伟浩

Process finished with exit code 0

文件上传

  • 发送文件(服务端)
package com.liang.lessonIp;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
//发送文件(再开启)
public class TcpClientDemo3 {
    public static void main(String[] args) throws Exception {
        //1.创建一个socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //2.创建一个输出流
        OutputStream os = socket.getOutputStream();
        //3.读取文件
        FileInputStream fis = new FileInputStream(new File("D:\\IdeaStudySpace\\JavaStudy\\src\\猪.gif"));
        //4.写出文件
        byte[] bytes = new byte[1024];
        int len;
        while ((len=fis.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        //通知服务器,我已经结束了
        socket.shutdownOutput();//我已经传输完了

        //确认服务器接收完毕,才能够断开连接
        InputStream inputStream = socket.getInputStream();
        //string byte[]  管道流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] bytes1 = new byte[1023];
        int len2;
        while ((len2=inputStream.read(bytes1))!=-1){
            baos.write(bytes1,0,len2);
        }
        System.out.println(baos.toString());

        //关闭资源,先开后关
        baos.close();
        inputStream.close();
        fis.close();
        os.close();
        socket.close();

    }
}

  • 接收文件(客户端)
package com.liang.lessonIp;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

//接收文件(先开启)
public class TcpClientDemo4 {
    public static void main(String[] args) throws Exception {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2.监听客户端的连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
        //3.获取输入流
        InputStream is = socket.getInputStream();
        //4.文件输出
        FileOutputStream fos = new FileOutputStream(new File("lwh.gif"));
        byte[] bytes = new byte[1024];
        int len;
        while ((len=is.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //通知客户端我接受完毕了
        OutputStream os = socket.getOutputStream();
        os.write("我接受完毕了,你可以断开了".getBytes());

        //关闭资源,先开后关
        is.close();
        fos.close();
        os.close();
        socket.close();
        serverSocket.close();
    }
}

Tomcat

服务端

  • 自定义S

  • Tomcat服务器 S

    客户端

    • 自定义 C
    • 浏览器 B

1.7、UDP

发送消息

服务端

package com.liang.lessonIp;

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

//不需要连接服务器
public class UdpClient {
    public static void main(String[] args) throws  Exception{
        //1.建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //2.建个包
        String msg = "你好,服务器";
        //发送给谁
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;
        //数据,数据的长度起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0, msg.getBytes().length, localhost,port);
        //3.发送包
        socket.send(packet);
        //关闭流
        socket.close();
    }
}

接收端

package com.liang.lessonIp;

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

//还是要等待客户端的连接
public class UdpServer {
    public static void main(String[] args) throws  Exception{
        //1.开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);

        //阻塞接收
        socket.receive(packet);
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭流
        socket.close();
    }
}

咨询

循环发送消息

package com.liang.lessonIp;

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

public class UdpSenderChat {
    public static void main(String[] args) throws Exception {

        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据,从控制台获取 system.in
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while (true) {

            String data = reader.readLine();
            byte[] bytes = data.getBytes();

            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 6666));

            socket.send(packet);
            if (data.equals("bye")) {
                break;
            }
        }
            socket.close();

    }
}

循环接收信息

package com.liang.lessonIp;

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

public class UdbReceiveChat {
    public static void main(String[] args) throws  Exception {
        DatagramSocket socket = new DatagramSocket(6666);
while (true) {
    //准备接收包裹
    byte[] container = new byte[1024];
    DatagramPacket packet = new DatagramPacket(container, 0, container.length);
    socket.receive(packet);//阻塞式接收包裹

    //断开连接 bye
    byte[] data = packet.getData();
    String s = new String(data, 0, data.length);
    System.out.println(s);

    if (s.equals("bye")) {
        break;
    }
}
socket.close();
    }
}

多线程咨询

发送端

package com.liang.lessonIp;

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

public class TaskSend implements Runnable{
  DatagramSocket socket= null;
  BufferedReader reader = null;

  private  int fromPort;
  private String toIP;
  private int toPort;

    public TaskSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Override
    public void run() {
        while (true) {
            String data = null;
            try {
                data = reader.readLine();
                byte[] bytes = data.getBytes();
                DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIP, this.toPort));

                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        socket.close();
    }
}

接收端

package com.liang.lessonIp;

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

public class TaskReceive implements Runnable{
  DatagramSocket socket= null;
    private int port;
    private String msgFrom;

    public TaskReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
          socket =   new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            //准备接收包裹
            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);//阻塞式接收包裹

                //断开连接 bye
                byte[] data = packet.getData();
                String s = new String(data, 0, data.length);
                System.out.println(s);

                System.out.println(msgFrom+s);

                if (s.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        socket.close();
    }
}

开启学生线程

package com.liang.lessonIp;

public class TalkStudent {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TaskSend(7777,"localhost",9999)).start();
        new Thread(new TaskReceive(8888, "老师")).start();
    }

}

开启老师线程

package com.liang.lessonIp;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TaskSend(5555,"localhost",8888)).start();
        new Thread(new TaskReceive(9999, "学生")).start();
    }
}

1.8、URL

https://www.baidu.com/
统一资源定位符:定位资源的,定位互联网上的某一个资源DNS 域名解析www.baidu.com xxx.X…x…x

1 协议: //ip地址:端口/ 项目名/资源

package com.liang.lessonIp;

import java.net.MalformedURLException;
import java.net.URL;

public class URL01 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080");

        System.out.println(url.getProtocol());//协议
        System.out.println(url.getPort());//端口
        System.out.println(url.getHost());//主机IP
        System.out.println(url.getQuery());//静态资源
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十一节 java中的线程类

java中常见类:字符串类 集合类 异常类 前面讲完了 程序:是含有指令和数据的文件, 被存储在磁盘或其他的数据存储 设备中,也就是说程序是静态的 代码。.c .java文件都放在外存里 获得资源获得CPU执行 这叫进程 程序和进程的…

【学习积累】Queue 与 ConcurrentQueue性能测试

在 C# 中&#xff0c;关于队列&#xff08;Queue&#xff09;有两种&#xff0c;一种就是我们普通使用的队列&#xff0c;另一种是线程安全的队列 ConcurrentQueue<T> 。 ConcurrentQueue表示线程安全的先进先出 (FIFO) 集合。https://learn.microsoft.com/zh-cn/dotnet…

【创作赢红包】python学习——【第七弹】

前言 上一篇文章 python学习——【第六弹】中介绍了 python中的字典操作&#xff0c;这篇文章接着学习python中的可变序列 集合 集合 1&#xff1a; 集合是python语言提供的内置数据结构&#xff0c;具有无序性&#xff08;集合中的元素无法通过索引下标访问&#xff0c;并且…

Qt框架概述

Qt框架概述一、什么是Qt二、了解QtCreator三、创建Qt项目*Qt项目框架及文件介绍四、设置窗口属性五、按钮创建按钮方式一按钮属性设置创建按钮方式二六、对象模型一、什么是Qt 概念&#xff1a; Qt是一个基于C的 跨平台的图形用户界面应用程序框架。 常见GUI Qt &#xff1a;…

状态错误 MSB8040,此项目需要缓解了 Spectre 漏洞的库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体

“Spectre Mitigation”缓解错误 如果出现“Spectre Mitigation”这种错误&#xff0c;就要了解下PIPE技术&#xff1a;流水线技术&#xff0c;比如3级流水线&#xff0c;避免CPU空闲&#xff0c;不浪费时间&#xff0c;但是前提是没有跳转&#xff0c;指令都是顺序执行的&…

pytorch transforms图像增强

一、前言 在学习自己的项目发现自己有很多基础知识不牢&#xff0c;对于图像处理有点不太清楚&#xff0c;因此写下来作为自己的笔记&#xff0c;主要是我想自己动手写一下每一句代码到底做了什么&#xff0c;而不是单纯的我看了知道了它做了什么&#xff0c;说白了&#xff0c…

【Maven】开发自己的starter依赖

【Maven】开发自己的starter依赖 文章目录【Maven】开发自己的starter依赖1. 准备工作1.1 创建一个项目1.2 修改pom文件1.3 修改项目结构2. 动手实现2.1 创建客户端类2.2 创建配置类2.3 配置路径2.4 下载到本地仓库3. 测试1. 准备工作 1.1 创建一个项目 打开idea&#xff0c;…

BP神经网络原来就是曲线拟合

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 在初学BP神经网络的时候&#xff0c;总是非常抽象和难理解 但是&#xff0c;学久了会发现&#xff0c;BP神经网络原来就是曲线拟合&#xff01; 一下子才具体、深入的理解到BP神经网络是什么 本文…

字节,腾讯过来的面试自动化测试就这水平吗?鬼知道经历了什么?

本人12年从业经验&#xff0c;曾就职于美团测试开发框架组&#xff0c;搭建过美团platuo测试框架&#xff0c;thrift测试框架&#xff0c;自动化测试平台&#xff0c;熟悉python3&#xff0c;java&#xff0c;vue&#xff0c;在多家公司从0到1搭建过自动化测试框架&#xff0c;…

linux文件编辑--vi

目录标题vi/vim中三种模式命令模式下的常用命令--光标移动输入模式末行模式vim中常用的操作类型命令行模式下的常用命令--复制、粘贴、删除命令模式下的常用命令--文件内容查找命令模式中的基本操作--撤销编辑及保存退出末行模式中的基本操作--保存文件内容及退出vi编辑器末行模…

GitHub标星15w,如何用Python实现所有算法?

学会了 Python 基础知识&#xff0c;想进阶一下&#xff0c;那就来点算法吧&#xff01;毕竟编程语言只是工具&#xff0c;结构算法才是灵魂。 新手如何入门 Python 算法&#xff1f; 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&#xf…

[论文阅读RGBD-SOD][2022_TCSVT_MoADNet][轻量化]

MoADNet: Mobile Asymmetric Dual-Stream Networks for Real-Time and Lightweight RGB-D Salient Object Detection paper&#xff1a;https://ieeexplore.ieee.org/abstract/document/9789193 动机 尽管已有许多优秀的RGB-D SOD技术被提出&#xff0c;但它们大多关注性能…

面试篇-从今天开始彻底分清Java内存模型JMM和运行时数据区

“相信很多人会把Java内存模型与Java运行时数据区给搞混淆” Java内存模型和Java运行时数据区是两个不同的概念&#xff0c;很容易让人混淆。下面简单介绍一下它们的区别&#xff1a; Java内存模型&#xff08;JMM&#xff09;是Java虚拟机规范中定义的一种内存模型&#xff…

如何优化快速排序?

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 还记得上次的快速排序吗&#xff1f;还记得 key 是怎么取的吗&#xff1f;当时我直接把数组的起始元素作为了 key 值&#xff0c;其实这样做是有弊端的&#xff0c;试想&#xff1a;一个降…

SAP Business Technology Platform (BTP)的架构理解

查资料看到的&#xff0c;转一下&#xff0c;附上链接&#xff1a; SAP Business Technology Platform (BTP)的架构理解 长期以来&#xff0c;我在与客户和伙伴的沟通交流中发现大家依然对SAP业务技术平台 – SAP Business Technology Platform (以下简称BTP)纯有各种疑惑&…

webgl-图形非矩阵旋转

知识拓展 由&#xff08;x1,y1&#xff09;旋转β角度到&#xff08;x2,y2&#xff09; 根据圆极坐标方程 x1 r*cosα y1 r*sinα 可得 x2 r*cos(α β) r*cosα*cosβ - r*sinα*sinβ,因为x1 r*cosα&#xff0c;y1 r*sinα&#xff0c;所以x2 x1*cosβ -y1*sinβ…

如何进行移动设备资产管理

随着越来越多的移动设备进入和访问组织的企业资源&#xff0c;管理员必须监视和控制对企业数据的访问。与传统工作站不同&#xff0c;传统工作站位于企业的物理工作区内&#xff0c;移动设备从多个位置使用&#xff0c;从而使移动资产管理过程更加复杂。 什么是移动资产管理 …

java基础集合面试题

什么是集合 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器 集合类存放的都是对象的引用&#xff0c;而不是对象的本身 集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)。 集合的特点 集合的特点主要有如下两点&…

LMKD分享

背景 Android是一个多任务系统&#xff0c;可以同时运行多个程序&#xff0c;一般来说&#xff0c;启动运行一个程序是有一定的时间开销的&#xff0c;因此为了加快运行速度&#xff0c;当你退出一个程序时&#xff0c;Android并不会立即杀掉它&#xff0c;这样下次再运行该程…

【MySQL优化】快速入门慢SQL优化

MySQL B树结构&#xff08;二叉排序树&#xff09; 索引 SQL优化&#xff0c;主要就是在优化索引 索引:相当于书的目录 索引:index是帮助MYSQL高效获取数据的数据结构。索引是数据结构&#xff08;树:B树(默认)、Hash树…) 索引的弊端: 1.索引本身很大&#xff0c;可以存…