C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP
一、NetworkStream
什么是NetworkStream?
NetworkStream
是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets
命名空间,并提供了通过网络连接进行读写操作的功能。NetworkStream
主要用于处理从网络套接字(Socket
)获得的输入和输出流数据
主要功能
NetworkStream
允许你通过网络连接进行流式数据传输。它可以用于发送和接收数据,通常与 TcpClient
、TcpListener
、Socket
等类一起使用,如下:
-
数据流:
NetworkStream
实现了Stream
抽象类,提供了基本的流操作方法,如Read
、Write
、Flush
和Close
。 -
实时传输: 它能够进行实时的数据传输,对于需要即时响应的网络通信尤为重要。
-
自动处理缓冲:
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
命名空间,提供了创建服务器应用程序的功能,通过它可以接收来自客户端的连接请求,并与客户端进行数据交换。
主要功能
- 监听端口:
TcpListener
监听特定的 IP 地址和端口号,以接受客户端的 TCP 连接请求。 - 接受连接: 它能够接收来自客户端的连接,并返回一个
TcpClient
对象,该对象可以用于与客户端进行数据交换。 - 异步操作: 支持异步操作,使得服务器能够处理多个连接而不会阻塞主线程。
关键方法和属性
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)
主要功能和特点
-
数据通信:
SerialPort
允许你在应用程序和外部设备之间发送和接收数据。它支持全双工和半双工通信,可以处理 ASCII 或二进制数据。 -
配置串行端口:
你可以配置串行端口的各种参数,包括波特率、数据位、停止位、奇偶校验等,以确保通信的正确性和可靠性。 -
事件处理:
SerialPort
提供了事件处理机制,如数据接收事件 (DataReceived
),可以在接收到数据时触发相应的处理逻辑。 -
同步与异步操作:
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 的数量是否符合预期的奇偶性要求。具体的工作原理如下:
奇偶校验原理
-
数据帧构成:
- 在串行通信中,数据通常以数据帧的形式发送。这些数据帧包括数据位、奇偶校验位和停止位。
- 数据位是实际传输的数据,奇偶校验位用于检测数据传输中的错误,停止位用于表示数据帧的结束。
-
奇偶校验位:
- 奇校验(Odd Parity):在数据帧中,奇偶校验位被设置为 1 或 0,以使数据帧中所有 1 的总数为奇数。如果总数已经是奇数,则校验位设置为 0;如果总数是偶数,则校验位设置为 1。
- 偶校验(Even Parity):在数据帧中,奇偶校验位被设置为 1 或 0,以使数据帧中所有 1 的总数为偶数。如果总数已经是偶数,则校验位设置为 0;如果总数是奇数,则校验位设置为 1。
-
传输过程:
- 当数据被发送时,发送端计算数据位中 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
属性可以设置为以下几种类型之一:
-
StopBits.None
:- 描述: 没有停止位。这个设置是不常用的,因为它可能导致接收端无法正确确定数据帧的结束位置。
- 使用场景: 不推荐使用,因为它可能会增加数据错误的风险。
-
StopBits.One
:- 描述: 使用一个停止位。最常用的设置,适用于大多数串行通信应用。
- 使用场景: 默认设置,适用于大多数标准串行通信协议。
-
StopBits.OnePointFive
:- 描述: 使用 1.5 个停止位。这是一个较少使用的设置。
- 使用场景: 某些特定的旧设备或协议可能需要此设置。
-
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)分配给用户的,通常用于访问互联网和提供在线服务。
区别与联系
-
地址范围:
- 局域网使用私有 IP 地址,这些地址在局域网内部有效,不可直接在互联网上使用。
- 广域网使用公网 IP 地址,这些地址在互联网上唯一,允许设备在全球范围内相互通信。
-
NAT(网络地址转换):
- 在局域网内部,设备使用私有 IP 地址进行通信。路由器会使用 NAT 技术将局域网内的私有 IP 地址转换为公网 IP 地址,从而允许局域网内部设备通过一个公网 IP 地址访问互联网。
-
访问方式:
- 局域网 IP 地址通常用于设备之间的内部通信,如家庭网络或企业网络。
- 广域网 IP 地址用于设备与外部网络之间的通信,如访问网站或与其他网络设备进行数据交换。
-
安全性:
- 私有 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? NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间,并提供了通过网络连接进行读写操作的功能。NetworkStream 主要用于处理从网络套接字(Soc…...
大模型--学习范式
1. 自监督学习(Self-Supervised Learning) 概念:自监督学习是一种特殊形式的监督学习,其中标签不是由人工标注的,而是从输入数据本身自动生成的。模型利用这些自动生成的标签进行训练。自监督学习通常用于预训练阶段&…...

Hadoop-yarn-unauthorized 未授权访问漏洞
一、漏洞描述: Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处理,Yarn是Hadoop集群的资源管理系统。YARN提供有默认开放在8088和8090的REST API(默认前者)允许用户直接通过…...
工作流调度系统(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)- 神经网络
系列文章: PyTorch 基础学习(1) - 快速入门 PyTorch 基础学习(2)- 张量 Tensors PyTorch 基础学习(3) - 张量的数学操作 PyTorch 基础学习(4)- 张量的类型 PyTorch 基础学…...

CI/CD 自动化:最大限度地提高极狐GitLab 群组的“部署冻结”影响
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...

单元训练10:定时器实现秒表功能-数组方式
蓝桥杯 小蜜蜂 单元训练10:定时器实现秒表功能-数组方式 /** 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款国外项目管理软件对比:PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时,你是否感到不知从何选择?市场上琳琅满目的选项往往令人眼花缭乱&…...
Angular组件概念
Angular 是一个由 Google 维护的开源前端框架,用于构建单页面应用(SPA)和移动Web应用。Angular 应用由多个组件(Components)组成,这些组件是 Angular 应用构建块的基本单位。 1. Angular 组件的基本概念 …...

嵌入式人工智能ESP32(4-PWM呼吸灯)
1、PWM基本原理 PWM(Pulse-width modulation)是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,…...

继承 (上)【C++】
文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么?继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象,但是父类对象不能直接赋值给…...

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

[C++][opencv]基于opencv实现photoshop算法图像剪切
【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数:src为源图像, dst为结果图像, rect为剪切区域 //返回值:返回0表示成功,否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…...

四十、大数据技术之Kafka3.x(3)
🌻🌻 目录 一、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(REmote Dictionary Server) Redis是现在主流的数据库之一,是一个使用ANSI C编写的开源、包含多种数据结构、支持网络的、基于内存、可选持久性的键值对存储数据。 特性 1.速度快 :Redis的数据全部存储瑜内存中。 …...

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

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

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评
Q:顺丰科技2025届校园招聘面向对象是? A:2025届应届毕业生,毕业时间段为2024年10月1日至2025年9月30日(不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘)。 Q:我可以投递几个岗…...
深入理解 Kibana 配置文件:一份详尽的指南
Kibana 是一个强大的数据可视化平台,它允许用户通过 Elasticsearch 轻松地探索和分析数据。Kibana 的配置文件 kibana.yml 是定制和优化 Kibana 行为的关键。在这篇博客中,我们将深入探讨 kibana.yml 文件中的各个配置项,并提供示例说明。 服…...

算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)
😀前言 在编程过程中,链表是一种常见的数据结构,它能够高效地进行插入和删除操作。然而,遍历链表并找到特定节点是一个典型的挑战,尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...