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

C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP

一、NetworkStream

什么是NetworkStream?

NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间,并提供了通过网络连接进行读写操作的功能NetworkStream 主要用于处理从网络套接字(Socket)获得的输入和输出流数据

主要功能

NetworkStream 允许你通过网络连接进行流式数据传输。它可以用于发送和接收数据,通常与 TcpClientTcpListenerSocket 等类一起使用,如下:

  • 数据流: NetworkStream 实现了 Stream 抽象类,提供了基本的流操作方法,如 ReadWriteFlushClose

  • 实时传输: 它能够进行实时的数据传输,对于需要即时响应的网络通信尤为重要。

  • 自动处理缓冲: NetworkStream 处理了网络数据传输中的缓冲区管理,帮助简化网络编程。

  • 同步和异步操作: NetworkStream 支持同步和异步数据读写操作,可以提高程序的响应能力和性能。

使用方法:

//  链接到服务器TcpClient  _tcpClient = new TcpClient("localhost",8080);// 获取networkstream 对象NetworkStream  _stream= _tcpClient.GetStream();// 发送数据string _message = "hello server";byte[] data=Encoding.ASCII.GetBytes( _message );_stream.Write( data, 0, data.Length );            // 向 NetworkStream 中写入数据,通常会指定一个字节数组和要写入的字节数_stream.WriteAsync(data, 0, data.Length); // 异步写入_stream.Flush(); // 将缓冲区中的所有数据写入到网络流中// 接收数据byte[]  _buffer=new byte[1024];int bytesRead = await  _stream.ReadAsync(_buffer, 0, _buffer.Length);            // 异步读取int _byteRead = _stream.Read(_buffer,0,_buffer.Length);string  _response=Encoding.ASCII.GetString( _buffer ,0,_buffer.Length);Console.WriteLine("Received: " + _response);_stream.Close();_stream.Close();

二、ConcurrentDictionary

ConcurrentDictionary 是 .NET 中的一个线程安全的字典实现,属于 System.Collections.Concurrent 命名空间。它设计用于在多线程环境下进行高效的并发操作,提供了一种安全的方法来存储和管理键值对,避免了多线程访问时的数据竞争和同步问题。

主要特点:

  • 线程安全: ConcurrentDictionary 允许多个线程同时读取和写入,而不需要外部同步机制。它内部使用锁和其他并发控制技术,确保在并发操作中数据的一致性和完整性。

  • 高效的并发操作: 它通过采用分段锁定、无锁技术和其他优化策略,提供了高效的性能,尤其是在大量并发操作时。

  • 支持并发集合操作: ConcurrentDictionary 支持常见的字典操作,如添加、移除和查找元素,并且提供了原子操作的方法,以保证线程安全

主要方法和属性

TryAdd(K key, V value):

尝试将指定的键值对添加到字典中。如果键已经存在,操作失败

bool added = myDict.TryAdd("key", "value");

TryGetValue(K key, out V value):

尝试获取指定键的值。如果键存在,返回 true 并通过 out 参数返回值,否则返回 false

if (myDict.TryGetValue("key", out string value))
{Console.WriteLine(value);
}

TryRemove(K key, out V value):

尝试移除指定的键及其对应的值。如果键存在并成功移除,返回 true 并通过 out 参数返回移除的值。

if (myDict.TryRemove("key", out string value))
{Console.WriteLine($"Removed: {value}");
}

AddOrUpdate(K key, V addValue, Func<K, V, V> updateValueFactory):

如果键不存在,则添加键值对;如果键存在,则使用 updateValueFactory 更新现有值。

myDict.AddOrUpdate("key", "newValue", (key, oldValue) => oldValue + " updated");

GetOrAdd(K key, V value):

如果键不存在,则添加键值对并返回新值;如果键已存在,则返回现有值。

string value = myDict.GetOrAdd("key", "defaultValue");

示例:

 public void Text(){ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();// 使用多个任务并发添加数据Parallel.For(0, 10000, i =>{concurrentDict.TryAdd(i.ToString(), i);});// 使用多个任务并发读取数据Parallel.For(0, 10000, i =>{if (concurrentDict.TryGetValue(i.ToString(), out int value)){Console.WriteLine($"Key: {i}, Value: {value}");}});// 使用 AddOrUpdate 方法更新数据concurrentDict.AddOrUpdate("50", 100, (key, oldValue) => oldValue + 50);// 输出更新后的值if (concurrentDict.TryGetValue("50", out int updatedValue)){Console.WriteLine($"Updated Key: 50, Value: {updatedValue}");}}

三、Socket类

属性

方法:

 C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)_网络_wenchm-GitCode 开源社区

TcpClient类

 TcpClient类用于在同步阻止模式下通过网络来连接、发送和接收流数据。为了使TcpClient连接并交换数据,TcpListener实例或Socket实例必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接该侦听器。

  • 创建一个TcpClient,并调用Connect方法连接。
  • 使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接。
  • TcpListener类用于在阻止同步模式下侦听和接受传入的连接请求。可使用TcpClient类或Socket类来连接TcpListener,并且可以使用IPEndPoint、本地IP地址及端口号或者仅使用端口号来创建TcpListener实例对象

属性、方法

TcpListener

TcpListener 是 .NET 中用于监听和接受传入 TCP 连接的类。它属于 System.Net.Sockets 命名空间,提供了创建服务器应用程序的功能,通过它可以接收来自客户端的连接请求,并与客户端进行数据交换。

主要功能

  1. 监听端口: TcpListener 监听特定的 IP 地址和端口号,以接受客户端的 TCP 连接请求。
  2. 接受连接: 它能够接收来自客户端的连接,并返回一个 TcpClient 对象,该对象可以用于与客户端进行数据交换。
  3. 异步操作: 支持异步操作,使得服务器能够处理多个连接而不会阻塞主线程。

关键方法和属性

AcceptTcpClient

阻塞当前线程,直到接受到一个 TCP 客户端连接请求,然后返回一个 TcpClient 对象

TcpClient client = listener.AcceptTcpClient();

AcceptTcpClientAsync():

异步地接受传入的 TCP 连接请求,返回一个 Task<TcpClient> 对象。

TcpClient client = await listener.AcceptTcpClientAsync();

AcceptSocket():

阻塞当前线程,直到接受到一个 TCP 客户端连接请求,然后返回一个 Socket 对象

Socket socket = listener.AcceptSocket();

AcceptSocketAsync():

异步地接受传入的 TCP 连接请求,返回一个 Task<Socket> 对象。

Socket socket = await listener.AcceptSocketAsync();

 BeginAcceptTcpClient:

用于异步地接受传入的 TCP 客户端连接请求。它允许你的应用程序在等待客户端连接的同时继续执行其他操作,从而提高了应用程序的响应能力和效率。

// 开始异步接受客户端连接listener.BeginAcceptTcpClient(AcceptTcpClientCallback, listener);

 AllowNatTraversal(true);

是一个用于控制网络地址转换(NAT)穿越功能的设置,通常在网络编程和网络应用中使用。这个设置可以用于启用或禁用 NAT 穿越功能,以便客户端和服务器能够更好地在 NAT 环境下进行通信。

       this._listener.AllowNatTraversal(true);

AllowNatTraversal

NAT 穿越简介

NAT(Network Address Translation)是一种网络地址转换技术,通常用于私有网络与公共互联网之间的地址转换。NAT 穿越(NAT Traversal)是指在 NAT 环境下使得两个端点能够相互通信的技术或方法。这对于点对点通信(如 VoIP、视频会议、P2P 文件传输等)尤为重要。

WebRTC 和 NAT 穿越
const configuration = {iceServers: [{urls: 'stun:stun.l.google.com:19302' // STUN 服务器地址},{urls: 'turn:turnserver.example.org',username: 'user',credential: 'pass'}]
};const peerConnection = new RTCPeerConnection(configuration);

以下是一个简单的使用 TcpListener 的示例,演示了如何创建一个基本的 TCP 服务器,监听客户端连接,并与客户端进行数据交换。

 static   async Task GodTcplister(){// 创建一个 TcpListener  监听器 实例,绑定到本地 IP 地址和端口号TcpListener _listener = new TcpListener(IPAddress.Any, 5000);// 启动监听 =======================================  _listener.Start();Console.WriteLine("Server started, waiting for connections...");// 接受客户端连接(异步)TcpClient _client = await _listener.AcceptTcpClientAsync(); // 接受客户端连接:===========================================Console.WriteLine("Client connected!");// 获取网络流NetworkStream _stream = _client.GetStream();// 读取客户端发送的数据byte[] _buffer = new byte[1024];int _bytesRead = await _stream.ReadAsync(_buffer, 0, _buffer.Length);string _receivedMessage = Encoding.ASCII.GetString(_buffer, 0, _bytesRead);Console.WriteLine($"Received: {_receivedMessage}");// 发送响应给客户端string _responseMessage = "Hello from server!";byte[] _responseBytes = Encoding.ASCII.GetBytes(_responseMessage);await _stream.WriteAsync(_responseBytes, 0, _responseBytes.Length);Console.WriteLine("Response sent to client.");// 关闭流和客户端_stream.Close();_client.Close();// 停止监听_listener.Stop();Console.WriteLine("Server stopped.");}

 服务端-客户端示例:

服务端:

    public  static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){Console.WriteLine("------------------------------------------------");            //输出消息  int _port = 8888;TcpClient _tcpClient;IPAddress[] _serverIP = Dns.GetHostAddresses("127.0.0.1");   //定义IP地址IPAddress _localAddress = _serverIP[0];                       //IP地址  TcpListener _tcpListener = new TcpListener(_localAddress, _port);          //监听套接字_tcpListener.Start();        //开始监听  Console.WriteLine("服务器启动成功,等待用户接入…");            //输出消息  while (true){try{_tcpClient = _tcpListener.AcceptTcpClient();          //每接收一个客户端则生成一个TcpClient  NetworkStream _networkStream = _tcpClient.GetStream();//获取网络数据流BinaryReader _reader = new  BinaryReader(_networkStream);           //定义流数据读取对象BinaryWriter _writer = new BinaryWriter (_networkStream);           //定义流数据写入对象while (true){try{string strReader = _reader.ReadString();      //接收消息string[] strReaders = strReader.Split(' ');//截取客户端消息Console.WriteLine("有客户端接入,客户IP:" + strReaders[0]);  //输出接收的客户端IP地址  Console.WriteLine("来自客户端的消息:" + strReaders[1]);        //输出接收的消息  string strWriter = "我是服务器,欢迎光临";    //定义服务端要写入的消息_writer.Write(strWriter);                    //向对方发送消息  }catch{break;}}}catch{break;}}}}

客户端:

    internal static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){TcpClient _tcpClient = new TcpClient();  //  创建一个客户端Console.WriteLine("========================");_tcpClient.Connect("127.0.0.1",8888);     // IP 端口 if(_tcpClient!=null){Console.WriteLine("连接服务器成功");NetworkStream _stream = _tcpClient.GetStream();   // 获取数据流BinaryReader    _reader = new BinaryReader(_stream);    // 定义二进制数据BinaryWriter    _writer = new BinaryWriter(_stream);string _localIp = "127.0.0.1";IPAddress[] _ips= Dns.GetHostAddresses(Dns.GetHostName());   // 获取所有的IP地址// 遍历 foreach (var ip in _ips){if (!ip.IsIPv6SiteLocal)   // 如果不是IPV6 地址{_localIp=ip.ToString();    // }}_writer.Write(_localIp + " 你好服务器,我是客户端");    //向服务器发送消息 while(true){try{string strReader = _reader.ReadString();     //接收服务器发送的数据  if (strReader != null){Console.WriteLine("来自服务器的消息:" + strReader);//输出接收的服务器消息}}catch{break;                          //接收过程中如果出现异常,退出循环  }}}Console.WriteLine("连接服务器失败");//Application.EnableVisualStyles();//Application.SetCompatibleTextRenderingDefault(false);//Application.Run(new Form1());}}

效果:

四、SerialPort串口

Modbus SerialPort 、TCP协议-CSDN博客

SerialPort 是 .NET 框架中的一个类,用于通过串行端口(也称为 COM 端口)进行数据通信。它提供了与串行通信相关的功能,使得 .NET 应用程序能够通过串行端口与外部设备(如传感器、调制解调器、打印机等)进行数据交换。

串口是什么-CSDN博客

RS-232 D型9针连接器

1、载波检测(CD)

2、接受数据(RXD)

3、发出数据(TXD)

4、数据终端准备好(DTR)

5、信号地线(SG)

6、数据准备好(DSR)

7、请求发送(RTS)

8、清除发送(CTS)

9、振铃指示(RI)

 

主要功能和特点

  1. 数据通信:

    SerialPort 允许你在应用程序和外部设备之间发送和接收数据。它支持全双工和半双工通信,可以处理 ASCII 或二进制数据。
  2. 配置串行端口:

    你可以配置串行端口的各种参数,包括波特率、数据位、停止位、奇偶校验等,以确保通信的正确性和可靠性。
  3. 事件处理:SerialPort 提供了事件处理机制,如数据接收事件 (DataReceived),可以在接收到数据时触发相应的处理逻辑。

  4. 同步与异步操作:

    SerialPort 支持同步和异步操作,允许在阻塞或非阻塞模式下进行数据读写

 全双工和半双工

全双工和半双工是两种不同的通信模式。全双工支持同时双向数据传输,提供了更高的通信效率和实时性;半双工则只允许单向数据传输,通常用于不需要同时双向通信的场景。选择哪种模式取决于具体的应用需求和通信环境

全双工(Full-Duplex)

  • 定义: 在全双工模式下,数据可以同时在两个方向上传输。这意味着通信双方可以在同一时间发送和接收数据。

  • 特点:

    • 双向传输: 数据在两个方向上都可以同时进行,没有冲突。
    • 效率高: 由于可以同时进行数据传输,整体的通信效率较高。
    • 应用: 常见于电话系统、现代网络通信(如以太网)等需要实时双向数据交流的场景。
  • 示例:

    • 电话: 在电话通信中,双方可以同时讲话和听对方说话,这就是全双工通信的一个例子。
    • 以太网: 现代以太网支持全双工模式,可以同时进行数据发送和接收。

半双工(Half-Duplex)

  • 定义: 在半双工模式下,数据只能在一个方向上进行传输,每次只能有一方进行发送或接收。这意味着在同一时间只能进行单向的数据通信。

  • 特点:

    • 单向传输: 在同一时间点上,数据只能单向传输,通信需要在发送和接收之间切换。
    • 效率相对较低: 由于不能同时进行双向传输,可能会造成通信延迟和效率降低。
    • 应用: 常见于对讲机、无线电通信等需要单向或切换单向通信的场景。
  • 示例:

    • 对讲机: 在使用对讲机时,用户必须按下按钮才能说话,放开按钮才能听对方讲话,这就是半双工通信的一个例子。
    • 传统的无线电: 传统的无线电通信通常是半双工的,发射和接收需要分开进行。

对比

  • 数据传输:

    • 全双工: 同时发送和接收数据。
    • 半双工: 发送和接收数据需要在不同时间进行。。

关键属性和方法

  • 属性:

    • PortName: 设置或获取串行端口的名称(例如 "COM1")。
    • BaudRate: 设置或获取通信的波特率。
    • DataBits: 设置或获取每个数据字节的位数(通常是 7 或 8)。
    • Parity: 设置或获取奇偶校验类型(例如 None, Odd, Even)。
    • StopBits: 设置或获取停止位的数量(例如 None, One, OnePointFive, Two)。
    • Handshake: 设置或获取握手协议(例如 None, XOnXOff, RequestToSend)。
    • ReadTimeout: 设置或获取读取操作的超时时间。
    • WriteTimeout: 设置或获取写入操作的超时时间。
  • 方法:

    • Open(): 打开串行端口,准备进行数据通信。
    • Close(): 关闭串行端口,释放相关资源。
    • Read(): 从串行端口读取数据。
    • Write(): 向串行端口写入数据。
    • DataReceived: 数据接收事件,在接收到数据时触发。

奇偶校验

奇偶校验是一种简单的错误检测机制,用于检测数据传输过程中是否出现了错误。其原理基于数据中 1 的数量是否符合预期的奇偶性要求。具体的工作原理如下:

奇偶校验原理
  1. 数据帧构成:

    • 在串行通信中,数据通常以数据帧的形式发送。这些数据帧包括数据位、奇偶校验位和停止位。
    • 数据位是实际传输的数据,奇偶校验位用于检测数据传输中的错误,停止位用于表示数据帧的结束。
  2. 奇偶校验位:

    • 奇校验(Odd Parity):在数据帧中,奇偶校验位被设置为 1 或 0,以使数据帧中所有 1 的总数为奇数。如果总数已经是奇数,则校验位设置为 0;如果总数是偶数,则校验位设置为 1。
    • 偶校验(Even Parity):在数据帧中,奇偶校验位被设置为 1 或 0,以使数据帧中所有 1 的总数为偶数。如果总数已经是偶数,则校验位设置为 0;如果总数是奇数,则校验位设置为 1。
  3. 传输过程:

    • 当数据被发送时,发送端计算数据位中 1 的数量,并根据所选的奇偶校验类型(奇校验或偶校验)设置校验位。
    • 接收端在接收到数据帧后,重新计算数据位中 1 的数量,并检查校验位是否符合预期的奇偶性。如果接收端计算的奇偶性与校验位不符,说明数据可能在传输过程中出现了错误。

示例

假设你要发送数据 1011001,使用偶校验:

  • 数据位(7 位):1011001
  • 1 的总数:4(偶数)

对于偶校验,校验位应该设置为 0(因为 4 是偶数)。

数据帧的最终格式可能是:

  • 数据位:1011001
  • 校验位:0

传输数据:10110010

接收端在接收到数据帧后:

  • 计算接收到的数据位 1011001 的 1 的总数:4(偶数)
  • 检查校验位 0 是否符合偶校验的要求(1 的总数为偶数)

如果校验通过,接收端可以确认数据传输是可靠的。如果校验失败,接收端将知道数据传输中可能发生了错误。

重要注意点
  • 奇偶校验的局限性:奇偶校验只能检测单个比特错误(即单一比特的改变),它不能检测到多个比特错误或数据重排的情况。对于更强的错误检测,通常需要使用更复杂的校验算法,如 CRC(循环冗余检查)。
  • 配置:在使用 SerialPort 时,正确配置奇偶校验确保发送端和接收端使用相同的校验设置是非常重要的。如果校验设置不匹配,可能会导致数据接收错误。
    SerialPort serialPort = new SerialPort("COM1");
    serialPort.Parity = Parity.Even; // 设置偶校验
    serialPort.BaudRate = 9600; // 设置波特率
    serialPort.DataBits = 8; // 数据位
    serialPort.StopBits = StopBits.One; // 停止位
    serialPort.Open();
    

停止位

在串行通信中,StopBits(停止位)是数据帧的一个重要部分,用于标识数据帧的结束。它的作用是帮助接收端确定数据帧的结束位置,并在接收数据时进行适当的同步。停止位确保数据传输的正确性和完整性。StopBits 的配置会影响数据传输的可靠性和时序

停止位的类型

StopBits 属性可以设置为以下几种类型之一:

  1. StopBits.None:

    • 描述: 没有停止位。这个设置是不常用的,因为它可能导致接收端无法正确确定数据帧的结束位置。
    • 使用场景: 不推荐使用,因为它可能会增加数据错误的风险。
  2. StopBits.One:

    • 描述: 使用一个停止位。最常用的设置,适用于大多数串行通信应用。
    • 使用场景: 默认设置,适用于大多数标准串行通信协议。
  3. StopBits.OnePointFive:

    • 描述: 使用 1.5 个停止位。这是一个较少使用的设置。
    • 使用场景: 某些特定的旧设备或协议可能需要此设置。
  4. StopBits.Two:

    • 描述: 使用两个停止位。提供比一个停止位更长的间隔,有助于处理更高的传输错误容忍度。
    • 使用场景: 适用于需要更高可靠性的通信或老旧设备的通信。
停止位的作用
  • 数据帧结束标识: 停止位标识数据帧的结束位置,使接收端能够正确地分离和处理每个数据帧。
  • 传输同步: 停止位提供了一段间隔,允许接收端进行时钟同步,确保接收数据的准确性。

五、局域网IP 和广域网IP

局域网(LAN)和广域网(WAN)是两种不同的网络类型,它们在 IP 地址的分配和使用上也有所不同。下面分别介绍这两种网络中的 IP 地址概念

局域网 IP 地址

局域网 IP 地址(LAN IP) 是指在局域网内部使用的 IP 地址。局域网通常指的是一个有限区域内的网络,例如家庭网络、办公室网络或学校网络等。局域网内的设备通过路由器或交换机连接在一起,通常使用私有 IP 地址来标识每个设备。

私有 IP 地址 是专门保留给局域网内部使用的 IP 地址范围,不能在公共互联网上直接访问。私有 IP 地址的范围包括:

  • A 类: 10.0.0.0 到 10.255.255.255
  • B 类: 172.16.0.0 到 172.31.255.255
  • C 类: 192.168.0.0 到 192.168.255.255

这些地址可以在局域网内部自由使用,而不需要向互联网服务提供商(ISP)申请公网 IP 地址。局域网内部的设备通过 NAT(网络地址转换)技术与外部的广域网进行通信。

      /// <summary>/// 获取本机的局域网IP/// </summary>        public static string LANIP{get{//获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IPIPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;//如果本机IP列表为空,则返回空字符串if (addressList.Length < 1){return "";}//返回本机的局域网IPreturn addressList[0].ToString();}}

广域网 IP 地址

广域网 IP 地址(WAN IP) 是指在广域网中使用的 IP 地址,广域网通常指的是覆盖较大地理区域的网络,例如互联网。广域网 IP 地址是全球唯一的,用于识别互联网上的每个设备或网络。

公网 IP 地址 是分配给广域网中的设备或网络的 IP 地址。与私有 IP 地址不同,公网 IP 地址是唯一的,并且在全球范围内可见。公网 IP 地址是由互联网服务提供商(ISP)分配给用户的,通常用于访问互联网和提供在线服务。

区别与联系

  1. 地址范围:

    • 局域网使用私有 IP 地址,这些地址在局域网内部有效,不可直接在互联网上使用。
    • 广域网使用公网 IP 地址,这些地址在互联网上唯一,允许设备在全球范围内相互通信。
  2. NAT(网络地址转换):

    • 在局域网内部,设备使用私有 IP 地址进行通信。路由器会使用 NAT 技术将局域网内的私有 IP 地址转换为公网 IP 地址,从而允许局域网内部设备通过一个公网 IP 地址访问互联网。
  3. 访问方式:

    • 局域网 IP 地址通常用于设备之间的内部通信,如家庭网络或企业网络。
    • 广域网 IP 地址用于设备与外部网络之间的通信,如访问网站或与其他网络设备进行数据交换。
  4. 安全性:

    • 私有 IP 地址只能在局域网内部访问,因此相对更安全。
    • 公网 IP 地址暴露在互联网上,可能会受到更多的安全威胁,因此需要额外的安全措施如防火墙和入侵检测系统。
  /// <summary>/// 获取本机在Internet网络的广域网IP/// </summary>        public static string WANIP{get{//获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IPIPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;//如果本机IP列表小于2,则返回空字符串if (addressList.Length < 2){return "";}//返回本机的广域网IPreturn addressList[1].ToString();}}

相关文章:

C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP

一、NetworkStream 什么是NetworkStream&#xff1f; NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间&#xff0c;并提供了通过网络连接进行读写操作的功能。NetworkStream 主要用于处理从网络套接字&#xff08;Soc…...

大模型--学习范式

1. 自监督学习&#xff08;Self-Supervised Learning&#xff09; 概念&#xff1a;自监督学习是一种特殊形式的监督学习&#xff0c;其中标签不是由人工标注的&#xff0c;而是从输入数据本身自动生成的。模型利用这些自动生成的标签进行训练。自监督学习通常用于预训练阶段&…...

Hadoop-yarn-unauthorized 未授权访问漏洞

一、漏洞描述&#xff1a; Hadoop是一款由Apache基金会推出的分布式系统框架&#xff0c;它通过著名的 MapReduce 算法进行分布式处理&#xff0c;Yarn是Hadoop集群的资源管理系统。YARN提供有默认开放在8088和8090的REST API&#xff08;默认前者&#xff09;允许用户直接通过…...

工作流调度系统(DolphinScheduler、Azkaban、Airflow、Oozie 和 XXL-JOB)

文章目录 1. DolphinScheduler1.1 DolphinScheduler介绍1.2 DolphinScheduler优点 2. Azkaban2.1 Azkaban介绍2.2 Azkaban优点 3. Airflow3.1 Airflow介绍3.1 Airflow优点 4. Oozie4.1 Oozie 介绍4.2 Oozie 优点 5. XXL-JOB5.1 XXL-JOB介绍5.2 XXL-JOB优点 6. 总结 1. DolphinS…...

PyTorch 基础学习(5)- 神经网络

系列文章&#xff1a; PyTorch 基础学习&#xff08;1&#xff09; - 快速入门 PyTorch 基础学习&#xff08;2&#xff09;- 张量 Tensors PyTorch 基础学习&#xff08;3&#xff09; - 张量的数学操作 PyTorch 基础学习&#xff08;4&#xff09;- 张量的类型 PyTorch 基础学…...

CI/CD 自动化:最大限度地提高极狐GitLab 群组的“部署冻结”影响

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

单元训练10:定时器实现秒表功能-数组方式

蓝桥杯 小蜜蜂 单元训练10&#xff1a;定时器实现秒表功能-数组方式 /** Description:* Author: fdzhang* Email: zfdcqq.com* Date: 2024-08-15 21:58:53* LastEditTime: 2024-08-16 19:07:27* LastEditors: fdzhang*/#include "stc15f2k60s2.h"#define LED(x) …...

国外项目管理软件最佳实践:选型与应用

国内外主流的10款国外项目管理软件对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时&#xff0c;你是否感到不知从何选择&#xff1f;市场上琳琅满目的选项往往令人眼花缭乱&…...

Angular组件概念

Angular 是一个由 Google 维护的开源前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和移动Web应用。Angular 应用由多个组件&#xff08;Components&#xff09;组成&#xff0c;这些组件是 Angular 应用构建块的基本单位。 1. Angular 组件的基本概念 …...

嵌入式人工智能ESP32(4-PWM呼吸灯)

1、PWM基本原理 PWM&#xff08;Pulse-width modulation&#xff09;是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则&#xff0c;…...

继承 (上)【C++】

文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么&#xff1f;继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象&#xff0c;但是父类对象不能直接赋值给…...

WPF打印控件内容

当我们想打印控件内容时&#xff0c;如一个Grid中的内容&#xff0c;可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下&#xff1a; XAML代码如下 <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width"300"…...

[C++][opencv]基于opencv实现photoshop算法图像剪切

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数&#xff1a;src为源图像&#xff0c; dst为结果图像, rect为剪切区域 //返回值&#xff1a;返回0表示成功&#xff0c;否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…...

四十、大数据技术之Kafka3.x(3)

&#x1f33b;&#x1f33b; 目录 一、Kafka Broker1.1 Kafka Broker工作流程1.1.1 Zookeeper 存储的Kafka信息1.1.2 Kafka Broker 总体工作流程1.1.3 Broker 重要参数 1.2 生产经验——节点服役和退役1.2.1 服役新节点1.2.2 退役旧节点 1.3 Kafka 副本1.3.1 副本基本信息1.3.2…...

redis——基本命令

什么是Reids&#xff08;REmote Dictionary Server&#xff09; Redis是现在主流的数据库之一&#xff0c;是一个使用ANSI C编写的开源、包含多种数据结构、支持网络的、基于内存、可选持久性的键值对存储数据。 特性 1.速度快 &#xff1a;Redis的数据全部存储瑜内存中。 …...

pytorch实现单层线性回归模型

文章目录 简述代码重构要点 数学模型、运行结果数据构建与分批模型封装运行测试 简述 python使用 数值微分法 求梯度&#xff0c;实现单层线性回归-CSDN博客 python使用 计算图&#xff08;forward与backward&#xff09; 求梯度&#xff0c;实现单层线性回归-CSDN博客 数值微分…...

智能小家电能否利用亚马逊VC搭上跨境快车?——WAYLI威利跨境助力商家

智能小家电行业在全球化背景下&#xff0c;正迎来前所未有的发展机遇。亚马逊为品牌商和制造商提供的一站式服务平台&#xff0c;为智能小家电企业提供了搭乘跨境快车、拓展国际市场的绝佳机会。 首先&#xff0c;亚马逊VC平台能够帮助智能小家电企业简化与亚马逊的合作流程&am…...

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评

Q&#xff1a;顺丰科技2025届校园招聘面向对象是&#xff1f; A&#xff1a;2025届应届毕业生&#xff0c;毕业时间段为2024年10月1日至2025年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘&#xff09;。 Q&#xff1a;我可以投递几个岗…...

深入理解 Kibana 配置文件:一份详尽的指南

Kibana 是一个强大的数据可视化平台&#xff0c;它允许用户通过 Elasticsearch 轻松地探索和分析数据。Kibana 的配置文件 kibana.yml 是定制和优化 Kibana 行为的关键。在这篇博客中&#xff0c;我们将深入探讨 kibana.yml 文件中的各个配置项&#xff0c;并提供示例说明。 服…...

算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)

&#x1f600;前言 在编程过程中&#xff0c;链表是一种常见的数据结构&#xff0c;它能够高效地进行插入和删除操作。然而&#xff0c;遍历链表并找到特定节点是一个典型的挑战&#xff0c;尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解…...

聊聊场景及场景测试

在我们进行测试过程中&#xff0c;有一种黑盒测试叫场景测试&#xff0c;我们完全是从用户的角度去理解系统&#xff0c;从而可以挖掘用户的隐含需求。 场景是指用户会使用这个系统来完成预定目标的所有情况的集合。 场景本身也代表了用户的需求&#xff0c;所以我们可以认为…...

Spring Web MVC入门(中)

1. 请求 访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 是学习如何传递参数到后端以及后端如何接收. 传递参数, 咱们主要是使⽤浏览器和Postman来模拟&#xff1b; 1.1 传递单个参数 接收单个参数&#xff0c;在Spring MV…...

Django后端架构开发:后台管理与会话技术详解

&#x1f31f; Django后端架构开发&#xff1a;后台管理与会话技术详解 &#x1f539; 后台管理&#xff1a;自定义模型类 Django的后台管理系统提供了强大的模型管理功能&#xff0c;你可以通过自定义模型类来控制模型在后台管理界面的显示和操作。自定义模型类通过继承admin…...

挑战Infiniband, 爆改Ethernet(2)

挑战Infiniband, 爆改Ethernet之物理层 前面说过UE为了挑战Infiniband在AI集群和HPC领域的优势地位&#xff0c;计划爆改以太网技术&#xff0c;以适应AI和HPC集群对高性能、可扩展网络的需求。正如UE联盟关于愿景的说明中宣称的&#xff1a;”提供一个完整的架构&#xff0c;通…...

Postman文件上传接口测试

接口介绍 返回示例 测试步骤 1.添加一个新请求&#xff0c;修改请求名&#xff0c;填写URL&#xff0c;选择请求方式 2.将剩下的media参数放在请求body里&#xff0c;选择form-data&#xff0c;选择key右边的类型为file类型&#xff0c;就会出现选择文件的按钮Select Files&a…...

stm32入门学习14-电源控制

有时候我们的程序中有些触发执行条件&#xff0c;有时这些触发频率很少&#xff0c;我们的程序就一直在循环&#xff0c;这样就很浪费电&#xff0c;我们可以通过PWR电源控制来实现低功耗模式&#xff0c;即只有在触发时才执行程序&#xff0c;其余时间可以关闭一些没必要的设备…...

[C++][opencv]基于opencv实现photoshop算法色相和饱和度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 HSL.hpp #ifndef OPENCV2_PS_HSL_HPP_ #define OPENCV2_PS_HSL_HPP_#include "opencv2/core.hpp" using namespace cv;namespace cv {enum HSL_COLOR {HSL_ALL,HSL_RED,HSL_YELLOW,HSL_GREEN,HS…...

Github 2024-08-16Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1Ruby项目1Apache Dubbo: 高性能的Java开源RPC框架 创建周期:4441 天开发语言:Java协议类型:Apache License 2.0St…...

AI学习记录 - torch 的 matmul和dot的关联,也就是点乘和点积的联系

有用大佬们点点赞 1、两个一维向量点积 &#xff0c;求 词A 与 词A 之间的关联度 2、两个词向量之间求关联度&#xff0c;求 : 词A 与 词A 的关联度 5 词A 与 词B 的关联度 11 词B 与 词A 的关联度 11 词B 与 词B 的关联度 25 刚刚好和矩阵乘法符合&#xff1a; 3、什么是…...

leetcode 885. Spiral Matrix III

题目链接 You start at the cell (rStart, cStart) of an rows x cols grid facing east. The northwest corner is at the first row and column in the grid, and the southeast corner is at the last row and column. You will walk in a clockwise spiral shape to visi…...

mysql windows安装与远程连接配置

安装包在主页资源中 一、安装(此安装教程为“mysql-installer-community-5.7.41.0.msi”安装教程&#xff0c;安装到win10环境) 保持默认选项&#xff0c;点击”Next“。 点开第一行加号展开一路展开找到“MySQL Server 5,7,41 - X64”点击选中点击一下中间只想右侧的箭头看到…...

子网掩码是什么以及子网掩码相关计算

子网掩码 (Subnet Mask) 又称网络掩码 (Netmask)&#xff0c;告知主机或路由设备&#xff0c;地址的哪一部分是网络号&#xff0c;包括子网的网络号部分&#xff0c;哪一部分是主机号部分。 子网掩码使用与IP地址相同的编址格式&#xff0c;即32 bit—4个8位组的32位长格式。…...

仿RabbitMQ实现消息队列

前言&#xff1a;本项目是仿照RabbitMQ并基于SpringBoot Mybatis SQLite3实现的消息队列&#xff0c;该项目实现了MQ的核心功能&#xff1a;生产者、消费者、中间人、发布、订阅等。 源码链接&#xff1a;仿Rabbit MQ实现消息队列 目录 前言&#xff1a;本项目是仿照Rabbi…...

SpringBoot教程(二十三) | SpringBoot实现分布式定时任务之xxl-job

SpringBoot教程&#xff08;二十三&#xff09; | SpringBoot实现分布式定时任务之xxl-job 简介一、前置条件&#xff1a;需要搭建调度中心1、先下载调度中心源码2、修改配置文件3、启动项目4、进行访问5、打包部署&#xff08;上正式&#xff09; 二、SpringBoot集成Xxl-Job1.…...

微前端架构的数据持久化策略与实践

微前端架构通过将一个大型前端应用拆分成多个小型、自治的子应用&#xff0c;提升了开发效率和应用的可维护性。然而&#xff0c;数据持久化作为应用的基础需求&#xff0c;在微前端架构中实现起来面临着一些挑战。本文将详细介绍在微前端架构下实现数据持久化的策略、技术和最…...

讲解 狼人杀中的买单双是什么意思

买单双这个概念通常出现在有第三方的板子中 比如 咒狐板子 丘比特板子 咒狐板子 第一天狼队只要推掉预言家 第二天就可以与咒狐协商绑票 推出其他好人 以及丘比特板子 如果拉出一个人狼链 那么如果孤独再连一个狼人 那么 狼队第一天就可以直接派人上去拿警徽&#xff0c;这样…...

回归分析系列5-贝叶斯回归

07贝叶斯回归 7.1 简介 贝叶斯回归将贝叶斯统计的思想应用于回归分析中&#xff0c;通过先验分布和似然函数来推断后验分布。在贝叶斯回归中&#xff0c;模型参数被视为随机变量&#xff0c;并且有自己的分布。通过贝叶斯公式&#xff0c;可以更新这些参数的分布&#xff0c;…...

oracle 数据中lsnrctl 是干啥的

突然发现lsnrctl stop 之后&#xff0c;依然可以启动数据库 就感觉怪怪的&#xff0c;一直以为这个是数据库的守护进程&#xff0c;原来不是。。。。 lsnrctl 是 Oracle 监听器控制实用程序的命令行界面工具&#xff0c;用于管理 Oracle Net 服务监听器。监听器是 Oracle 网络…...

Linux进程--进程地址空间

文章目录 一、进程地址空间1.想当然的内存2.实际的内存1.什么是地址空间2.地址空间和内存3.为什么要区分两种内存 一、进程地址空间 1.想当然的内存 我们在之前的学习中了解过内存的概念&#xff0c;所以变量都要存在内存中我们的程序才能跑起来&#xff0c;那么我们肯定也见…...

C语言传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值 实例1&#xff1a;获取系统的时间值 能接受指针作为参数的函数&#xff0c;也能接受数…...

探索 Kubernetes 持久化存储之 Rook Ceph 初窥门径

在 Kubernetes 生态系统中&#xff0c;持久化存储是支撑业务应用稳定运行的基石&#xff0c;对于维护整个系统的健壮性至关重要。对于选择自主搭建 Kubernetes 集群的运维架构师来说&#xff0c;挑选合适的后端持久化存储解决方案是关键的选型决策。目前&#xff0c;Ceph、Glus…...

今日(2024 年 8 月 13 日)科技新闻

我国成功发射卫星互联网高轨卫星&#xff1a;该卫星的成功发射将助力我国卫星互联网的发展。中国首台中子全散射谱仪运行 3 年成果丰硕&#xff1a;由粤港科技合作打造的多物理谱仪&#xff0c;在中国散裂中子源上运行 3 年来&#xff0c;已完成 300 多项用户实验。该谱仪的关键…...

Unity大场景切换进行异步加载时,如何设计加载进度条,并配置滑动条按照的曲线给定的速率滑动

一、异步加载场景的过程 1、异步加载场景用到的API LoadSceneAsync 2、异步加载的参数说明 &#xff08;1&#xff09;默认参数&#xff1a;SceneManagement.LoadSceneAsync(“SceneName”); AsyncOperation task SceneManager.LoadSceneAsync("SceneName");&a…...

Selenium + Python 自动化测试16(Python基础复习)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了使用模块化测试的测试模型&#xff0c;从某一程度也反映出熟练掌握一门编程语言的重要性。 为了后续进一步深入学习。本篇文章主要做下Python基础知识的复习。…...

2024新型数字政府综合解决方案(六)

新型数字政府综合解决方案通过融合人工智能、大数据、区块链和云计算技术&#xff0c;构建了一个全方位智能化的政务平台&#xff0c;旨在提升政府服务的效率、透明度和公众参与度。该方案实现了跨部门的数据互联互通与实时更新&#xff0c;利用先进的数据分析和自动化处理技术…...

vscode的C/C++环境配置和调试技巧

目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…...

Python制作《扫雷》游戏-附源码,轻松看懂,简单易学

今天介绍另一款经典小游戏&#xff0c;扫雷&#xff0c;这个应该是很多人windows电脑里玩的最多的游戏了&#xff0c;乐趣很多&#xff0c;而且还有一定的技术含量在里面&#xff0c;今天我们就来通过python实现这个小游戏。 创建扫雷文件 打开pycharm&#xff0c;创建一个名…...

8路VBO转HDMI2.0支持4K60频率ITE6265芯片方案心得分享

在此之前&#xff0c;有人找到我这边询问能不能将智能电视主板改成机顶盒&#xff0c;将VBO信号转换输出位HDMI进行投屏&#xff0c;具体应用奇奇怪怪&#xff01;但是奈何是甲方大佬。认命照做。从网上也有搜索了解过这类芯片&#xff0c;发现资料很少&#xff0c;所以有了这篇…...

【问题解决3】【已解决】Cannot determine path to‘tools.jar‘libraryfor17

前几天在IDEA运行JAVA项目时&#xff0c;出现这个报错。 这是因为是这个笔记本上安装的IDEA版本是“IntelliJ IDEA 2020.3.1”&#xff0c;与JDK17版本不兼容&#xff0c;这种情况下要想使得IDEA版本与JDK版本兼容&#xff0c;就需要升级IDEA版本或者使用JDK较低版本&#xff…...

基于Spring Boot的高效宠物购物平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…...