C#中面试的常见问题004

news2024/11/28 3:42:35

1.socket是怎么实现的

1. 套接字接口(Socket API)

套接字接口是一组用于创建和管理套接字的函数和协议,它们定义了应用程序与网络协议栈之间的交互方式。这些接口包括:

  • socket():创建一个新的套接字。
  • bind():将套接字与特定的网络地址和端口绑定。
  • listen():使套接字进入监听状态,等待传入连接。
  • accept():接受传入连接请求。
  • connect():发起连接请求。
  • send() 和 recv():发送和接收数据。
  • close():关闭套接字。

2. 协议族

套接字可以基于不同的协议族创建,最常见的是IPv4(AF_INET)和IPv6(AF_INET6),以及流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。

3. 网络地址和端口

套接字通信需要网络地址(IP地址)和端口号来标识通信的端点。端口号用于区分同一IP地址上的不同服务。

4. 三次握手

对于流式套接字(如TCP),建立连接需要经过三次握手过程,确保双方都可以发送和接收数据。

5. 数据传输

数据在套接字之间通过缓冲区传输。发送方将数据写入缓冲区,接收方从缓冲区读取数据。

6. 四次挥手

流式套接字在结束通信时,需要通过四次挥手过程来关闭连接,释放资源。

7. 内核网络协议栈

操作系统的内核网络协议栈负责处理网络通信的细节,包括数据包的接收、处理、路由和传输。

8. 硬件支持

网络接口卡(NIC)和相关的硬件驱动程序负责在物理网络上发送和接收数据包。

实现步骤

在编程中,使用套接字通常遵循以下步骤:

  1. 创建套接字

    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  2. 绑定套接字(对于服务器):

    struct sockaddr_in server_addr;
    // 设置服务器地址
    bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  3. 监听连接(对于服务器):

    listen(socket_fd, backlog);
  4. 接受连接(对于服务器):

    int client_fd = accept(socket_fd, (struct sockaddr*)&client_addr, &addrlen);
  5. 连接到服务器(对于客户端):

    connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  6. 发送和接收数据

    send(client_fd, buffer, strlen(buffer), 0);
    recv(client_fd, buffer, sizeof(buffer), 0);
  7. 关闭套接字

    close(client_fd);

2.udp的优缺点

UDP的优点:

  1. 速度快

    • UDP没有建立连接的过程,不需要三次握手,因此可以立即发送数据。
    • 没有维持连接状态的开销,减少了额外的延迟。
  2. 简单性

    • UDP的协议栈相对简单,只提供最基本的功能,如数据报的发送和接收。
  3. 低延迟

    • 由于没有确认、重传和流量控制机制,UDP通常提供更低的延迟。
  4. 资源消耗少

    • 因为UDP不维护连接状态,所以服务器可以处理更多的UDP数据报,消耗的资源比TCP少。
  5. 适用性

    • 适用于那些对实时性要求高、偶尔丢失数据包也能接受的应用,如视频会议、在线游戏和实时多媒体传输。
  6. 无需建立连接

    • 可以广播和多播,适用于需要向多个接收者发送相同消息的场景。

UDP的缺点:

  1. 不可靠性

    • UDP不保证数据报的顺序或完整性,数据报可能会丢失、重复或乱序到达。
  2. 无拥塞控制

    • UDP不进行拥塞控制,可能会在网络拥塞时导致更多的数据丢失。
  3. 不提供流量控制

    • 发送方可能会淹没接收方,特别是在接收方处理速度慢于发送方时。
  4. 无错误恢复

    • UDP不提供错误恢复机制,如果数据报丢失或损坏,需要应用程序自己处理。
  5. 安全性低

    • UDP没有内置的安全机制,如加密或认证,容易受到攻击。
  6. 不适合大数据传输

    • 对于需要可靠传输的大容量数据,UDP可能不是最佳选择,因为它不保证数据的完整性。
  7. 需要应用程序实现额外功能

    • 应用程序需要自己实现确认、重传、排序等机制,增加了开发复杂性。

3.委托与事件

委托(Delegate)

委托是一种特殊的类型,它定义了方法的类型。委托可以指向一个方法或多个方法(通过 multicast delegate 支持)。委托类似于C或C++中的函数指针,但它们是类型安全的,并且可以引用实例方法和静态方法。

特点

  • 类型安全:委托是类型安全的,编译器会检查委托是否指向了正确签名的方法。
  • 多播:委托支持多播,即一个委托可以附加多个方法,当委托被调用时,这些方法会按顺序执行。
  • 灵活性:委托可以被动态地附加和移除方法。

定义和使用委托

public delegate int Operation(int x, int y); // 定义一个委托类型
public static int Add(int x, int y) { return x + y; }
public static int Multiply(int x, int y) { return x * y; }

Operation op = Add; // 委托实例可以指向一个方法
op += Multiply; // 委托可以附加另一个方法
int result = op(5, 3); // 调用委托,Add 和 Multiply 都会被执行

事件(Event)

事件是一种特殊的多播委托,用于发布-订阅模式。事件是类成员,它们提供了一种机制,允许对象通知其他对象发生了某个动作或到达了某个状态。

特点

  • 封装:事件是类的成员,提供了封装,使得类可以控制对事件的访问。
  • 订阅和取消订阅:客户端代码可以订阅(监听)或取消订阅(停止监听)事件。
  • 线程安全:事件的订阅和取消订阅通常是线程安全的。
  • 触发:事件有一个特殊的语法 event 关键字,用于声明事件,并且有一个 raise 操作符 ?. 用于触发事件。

定义和使用事件

public class Calculator
{
    public delegate int Operation(int x, int y);
    public event Operation CalculateEvent;

    public void PerformOperation(int x, int y)
    {
        CalculateEvent?.Invoke(x, y); // 触发事件
    }
}

// 客户端代码
Calculator calc = new Calculator();
calc.CalculateEvent += (sender, e) => Console.WriteLine("Result: " + e(5, 3));
calc.PerformOperation(5, 3);

委托与事件的区别

  • 用途:委托是一种通用的类型,可以用于任何需要引用方法的场景。事件是一种特殊的委托,专门用于实现发布-订阅模式。
  • 控制:事件提供了额外的封装,允许类控制对事件的访问和触发。委托则没有这种控制。
  • 触发:事件使用 ?. 操作符触发,这是一种安全的方式,可以避免在没有订阅者时引发异常。委托则直接调用。
  • 订阅:事件提供了订阅和取消订阅的机制,而委托则需要手动附加和移除方法。

4.如何跨线程调用

1. Control.Invoke / Control.BeginInvoke(WinForms)

在WinForms应用程序中,Control.InvokeControl.BeginInvoke 方法用于在控件的创建线程(通常是主UI线程)上执行代码。

// 同步调用
myControl.Invoke((MethodInvoker)delegate
{
    // 这段代码将在UI线程上执行
    myControl.Text = "更新UI";
});

// 异步调用
myControl.BeginInvoke((MethodInvoker)delegate
{
    // 这段代码将在UI线程上执行
    myControl.Text = "更新UI";
});

2. Dispatcher.Invoke / Dispatcher.BeginInvoke(WPF)

在WPF应用程序中,Dispatcher.InvokeDispatcher.BeginInvoke 方法用于在UI线程上执行代码。

// 同步调用
myControl.Dispatcher.Invoke(() =>
{
    // 这段代码将在UI线程上执行
    myControl.Text = "更新UI";
});

// 异步调用
myControl.Dispatcher.BeginInvoke(() =>
{
    // 这段代码将在UI线程上执行
    myControl.Text = "更新UI";
});

3. Task.Run / ThreadPool.QueueUserWorkItem

这些方法用于在后台线程上执行任务,而不是直接跨线程调用,但它们常用于启动后台操作。

// 使用Task.Run
Task.Run(() =>
{
    // 这段代码将在后台线程上执行
});

// 使用ThreadPool.QueueUserWorkItem
ThreadPool.QueueUserWorkItem(state =>
{
    // 这段代码将在后台线程上执行
});

4. BackgroundWorker(WinForms/WPF)

BackgroundWorker 组件提供了一种简单的方式来在后台线程上执行操作,并安全地更新UI。

// 设置 BackgroundWorker
backgroundWorker1.DoWork += (sender, e) =>
{
    // 后台线程中执行的工作
};

backgroundWorker1.RunWorkerCompleted += (sender, e) =>
{
    // 安全地更新UI
    myControl.Text = "操作完成";
};

// 启动后台工作线程
backgroundWorker1.RunWorkerAsync();

5. await / async(异步编程)

在C# 5.0及以上版本中,asyncawait 关键字使得异步编程更加简洁和易于管理。

public async Task MyAsyncMethod()
{
    // 异步执行后台操作
    await Task.Run(() =>
    {
        // 这段代码将在后台线程上执行
    });

    // 安全地更新UI
    myControl.Text = "操作完成";
}

注意事项

  • 当跨线程更新UI时,确保使用正确的方法(如InvokeDispatcher.Invoke)来避免线程冲突。
  • 异步编程可以提高应用程序的响应性,但需要正确处理异步操作的完成和异常。
  • 在跨线程调用时,注意线程安全和数据同步问题,避免共享资源的竞争条件。

5.invoke与begininvoke的区别

Invoke 方法

  • Invoke 是一个同步方法,它在调用线程上阻塞,直到指定的委托在UI线程上执行完毕。
  • 使用 Invoke 时,方法调用会立即排队执行,并等待操作完成,这可能会导致性能问题,特别是在执行长时间运行的操作时。
  • Invoke 方法适用于需要立即更新UI或需要UI更新结果的情况。

BeginInvoke 方法

  • BeginInvoke 是一个异步方法,它在调用线程上不会阻塞,而是将委托排队到UI线程上异步执行。
  • 使用 BeginInvoke 时,方法调用会立即返回,委托将在UI线程上的未来某个时间点执行,这使得调用线程可以继续执行其他任务。
  • BeginInvoke 方法适用于不需要立即UI更新结果的情况,特别是在执行可能耗时的操作时,可以提高应用程序的响应性。

示例代码

// 同步调用,使用 Invoke
myControl.Invoke((MethodInvoker)delegate
{
    // 这段代码将在UI线程上执行,调用线程将等待其完成
    myControl.Text = "更新UI";
});

// 异步调用,使用 BeginInvoke
IAsyncResult result = myControl.BeginInvoke((MethodInvoker)delegate
{
    // 这段代码将在UI线程上执行,但调用线程不会等待
    myControl.Text = "更新UI";
});

// 如果需要等待异步操作完成,可以使用 EndInvoke
myControl.EndInvoke(result);

注意事项

  • 使用 Invoke 和 BeginInvoke 时,需要确保委托中的操作是线程安全的,因为它们将在UI线程上执行。
  • BeginInvoke 返回一个 IAsyncResult 对象,可以通过它来检查操作的状态或等待操作完成。
  • 如果在委托执行期间UI控件被销毁,使用 Invoke 可能会导致异常。而 BeginInvoke 会安全地处理这种情况,不会抛出异常。

6.怎么保证线程安全

1. 锁定(Locking)

使用锁(如互斥锁 Mutexlock 关键字等)来同步对共享资源的访问。

private readonly object _lockObject = new object();

public void SafeMethod()
{
    lock (_lockObject)
    {
        // 访问或修改共享资源
    }
}

2. 原子操作

使用原子操作类(如 Interlocked)来确保某些操作(如递增、递减)的原子性。

private int _counter;

public void IncrementCounter()
{
    Interlocked.Increment(ref _counter);
}

3. 线程局部存储(Thread Local Storage)

使用 ThreadLocal<T> 提供每个线程独有的数据副本,避免共享状态。

private static ThreadLocal<int> _threadLocalValue = new ThreadLocal<int>(() => 0);

public void ThreadSafeMethod()
{
    int value = _threadLocalValue.Value;
    // 使用 value 执行操作
}

4. 不可变对象

设计不可变对象,一旦创建就不能更改其状态,因此天然线程安全。

public class ImmutableClass
{
    public int Value { get; }

    public ImmutableClass(int value)
    {
        Value = value;
    }
}

5. 条件同步原语

使用条件同步原语(如 MonitorSemaphoreAutoResetEvent 等)来控制对资源的访问。

private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);

public async Task SafeMethodAsync()
{
    await _semaphore.WaitAsync();
    try
    {
        // 访问或修改共享资源
    }
    finally
    {
        _semaphore.Release();
    }
}

6. volatile 关键字

使用 volatile 关键字确保对变量的读写操作对所有线程立即可见。

private volatile bool _flag;

public void SetFlag()
{
    _flag = true;
}

public void CheckFlag()
{
    if (_flag)
    {
        // 执行操作
    }
}

7. 内存屏障

在某些低级场景下,使用内存屏障(如 Thread.MemoryBarrier)来防止指令重排。

8. 避免共享状态

尽可能设计无状态或少状态的系统,减少共享状态的使用。

9. 线程安全集合

使用 System.Collections.Concurrent 命名空间下的线程安全集合,如 ConcurrentDictionaryBlockingCollection 等。

private readonly ConcurrentDictionary<int, string> _concurrentDictionary = new ConcurrentDictionary<int, string>();

public void AddItem(int key, string value)
{
    _concurrentDictionary.TryAdd(key, value);
}

10. 免疫区(MemoryBarrier)

在某些情况下,使用免疫区模式,确保在一段代码块中只有一个线程可以执行。

7.静态方法有没有构造函数,构造函数什么时候执行

静态方法

  • 静态方法是属于类的,可以通过类名直接访问,而不需要创建类的实例。
  • 静态方法不能访问类的实例成员,因为它们不依赖于任何对象实例。
  • 静态方法可以在没有创建类实例的情况下被调用。

构造函数

  • 构造函数是一种特殊的方法,用于在创建类的新实例时初始化对象。
  • 构造函数的名称必须与类名完全相同,并且没有返回类型。
  • 构造函数在创建新对象时自动调用。

构造函数的执行时机

构造函数在以下情况下执行:

  1. 创建新对象时: 当你使用new关键字创建类的实例时,构造函数会被调用。例如:

    MyClass obj = new MyClass();

    在这个例子中,MyClass的构造函数会被调用,以初始化obj

  2. 继承和基类构造函数: 如果一个类继承自另一个类,那么在派生类的构造函数中,必须显式调用基类的构造函数(如果没有直接调用,编译器会默认插入对基类无参数构造函数的调用)。基类的构造函数会先于派生类的构造函数执行。

    public class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("Base class constructor");
        }
    }
    
    public class DerivedClass : BaseClass
    {
        public DerivedClass()
        {
            Console.WriteLine("Derived class constructor");
        }
    }
    
    // 当创建DerivedClass的实例时,输出将是:
    // Base class constructor
    // Derived class constructor
  3. 静态构造函数: 静态构造函数是一种特殊的构造函数,用于初始化类的静态成员。它在第一次访问类的静态成员或实例成员之前自动调用,并且只调用一次。

    public class MyClass
    {
        static MyClass()
        {
            Console.WriteLine("Static constructor");
        }
    
        public MyClass()
        {
            Console.WriteLine("Instance constructor");
        }
    
        static int staticField;
    }
    
    // 当访问静态字段时,静态构造函数被调用:
    Console.WriteLine(MyClass.staticField);
    // 输出:Static constructor

8.拓展方法

拓展方法的定义

拓展方法是一种特殊的静态方法,它的第一个参数使用this关键字来指定要扩展的类型。这个方法必须在静态类中定义。

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Length;
    }
}

在上面的例子中,我们定义了一个名为WordCount的拓展方法,它将被添加到string类型中。

使用拓展方法

使用拓展方法就像调用原始类型的实例方法一样简单。由于WordCount方法被定义为string类型的拓展方法,你可以直接在任何string对象上调用它,如下所示:

string sentence = "Hello, world!";
int count = sentence.WordCount(); // 使用拓展方法

注意事项

  1. 静态类:拓展方法必须定义在静态类中。
  2. 静态方法:拓展方法本身是一个静态方法,但它们的第一个参数使用this关键字,这使得它们看起来像是实例方法。
  3. 重载:拓展方法可以重载,就像普通方法一样。
  4. 访问级别:拓展方法可以访问实例成员,就像普通实例方法一样。
  5. 性能:拓展方法不会影响性能,因为它们在编译时被转换为普通的静态方法调用。
  6. 类型安全:拓展方法在编译时被处理,因此它们是类型安全的。

拓展方法的应用场景

  • 为现有类型添加功能:例如,为List<T>添加一个方法来返回列表中的第N个元素。
  • 为第三方库提供扩展:为第三方库中的类型添加额外的功能,而无需修改原始库。
  • LINQ:拓展方法是实现LINQ查询语法的关键,它们允许你对集合执行查询和转换操作

9.如何将全屏所有的输入框设置为禁止输入

方法1:递归遍历所有控件

你可以编写一个递归方法来遍历窗体上的所有控件,并将它们的 ReadOnly 属性设置为 true

private void SetControlsReadOnly(bool readOnly)
{
    foreach (Control control in this.Controls)
    {
        control.ReadOnly = readOnly;
        if (control.HasChildren)
        {
            foreach (Control child in control.Controls)
            {
                child.ReadOnly = readOnly;
            }
        }
    }
}

然后,你可以调用这个方法来设置所有输入框为禁止输入:

SetControlsReadOnly(true);

方法2:使用WinForms UI Automation

如果你需要在运行时动态地设置所有输入框为禁止输入,可以使用WinForms UI Automation。这种方法允许你查找所有特定类型的控件(如 TextBox)并设置它们的属性。

private void SetTextBoxesReadOnly(bool readOnly)
{
    foreach (Control control in this.Controls)
    {
        if (control is TextBox textBox)
        {
            textBox.ReadOnly = readOnly;
        }
        else if (control.HasChildren)
        {
            SetTextBoxesReadOnly(readOnly); // 递归调用
        }
    }
}

方法3:使用Reflection

如果你想要设置所有继承自 TextBoxBase 的控件(包括 TextBoxRichTextBox 等),可以使用反射来实现。

private void SetTextBoxBaseReadOnly(bool readOnly)
{
    var textBoxBaseType = typeof(TextBoxBase);
    foreach (Control control in this.Controls)
    {
        if (textBoxBaseType.IsAssignableFrom(control.GetType()))
        {
            control.ReadOnly = readOnly;
        }
        else if (control.HasChildren)
        {
            SetTextBoxBaseReadOnly(readOnly); // 递归调用
        }
    }
}

注意事项

  • 这些方法假设你想要递归地遍历所有子控件。如果你的窗体有复杂的控件层次结构,这可能会影响性能。
  • 在设置 ReadOnly 属性时,确保考虑到所有可能的输入控件类型,如 TextBoxRichTextBoxMaskedTextBox 等。
  • 如果你的应用程序中有自定义控件或第三方控件,可能需要额外的逻辑来处理这些控件。

10.自定义控件

1. 继承自现有控件类

你可以从现有的控件类(如ControlTextBoxButton等)继承来创建自定义控件。

public class MyCustomControl : Control
{
    // 自定义属性、方法和事件
}

2. 定义属性和方法

在你的自定义控件中,可以定义自己的属性和方法,以提供特定的功能。

public class MyCustomControl : Control
{
    private int _myProperty;
    public int MyProperty
    {
        get { return _myProperty; }
        set { _myProperty = value; Invalidate(); } // 触发重绘
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        // 自定义绘制逻辑
        e.Graphics.DrawString("My Custom Control", this.Font, this.ForeColor, this.ClientRectangle);
    }
}

3. 自定义绘制

通过覆盖OnPaint方法,你可以自定义控件的绘制逻辑。

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // 使用e.Graphics对象进行绘制
}

4. 处理事件

你可以在自定义控件中处理事件,并根据需要引发新的事件。

private void MyMethod()
{
    // 当发生特定事件时
    MyCustomEventArgs args = new MyCustomEventArgs();
    OnMyCustomEvent(this, args);
}

protected virtual void OnMyCustomEvent(object sender, MyCustomEventArgs e)
{
    // 引发事件
    MyCustomEventHandler handler = MyCustomEvent;
    if (handler != null)
    {
        handler(sender, e);
    }
}

5. 使用自定义控件

一旦你创建了自定义控件,就可以在WinForms应用程序中使用它,就像使用其他标准控件一样。

MyCustomControl customControl = new MyCustomControl();
customControl.MyProperty = 10;
this.Controls.Add(customControl);

6. 设计时支持

如果你希望你的自定义控件在Visual Studio的设计器中可用,你可以使用DesignerAttribute来指定设计器类。

[Designer(typeof(MyCustomControlDesigner))]
public class MyCustomControl : Control
{
    // 控件代码
}

public class MyCustomControlDesigner : ControlDesigner
{
    // 设计器代码
}

注意事项

  • 自定义控件应该具有良好的封装性,隐藏内部实现细节。
  • 在自定义控件中,合理使用Invalidate方法来触发重绘。
  • 考虑性能和资源管理,例如在绘制时避免不必要的操作。
  • 如果自定义控件需要响应用户输入,适当重写OnMouseDownOnMouseUp等方法。

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

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

相关文章

《UnityShader 入门精要》更复杂的光照

代码&示例图见&#xff1a;zaizai77/Shader-Learn: 实现一些书里讲到的shader 到了这里就开启了书里的中级篇&#xff0c;之后会讲解 Unity 中的渲染路径&#xff0c;如何计算光照衰减和阴影&#xff0c;如何使用高级纹理和动画等一系列进阶内容 Unity 中的渲染路径 在U…

用nextjs开发时遇到的问题

这几天已经基本把node后端的接口全部写完了&#xff0c;在前端开发时考虑时博客视频类型&#xff0c;考虑了ssr&#xff0c;于是选用了nextJs&#xff0c;用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…

Golang项目:实现一个内存缓存系统

要求 支持设定过期时间&#xff0c;精确到秒支持设定最大内存&#xff0c;当内存超过时做出合适的处理支持并发安全按照以下接口安全 type Cache interface{//size : 1KB 100KB 1MB 2MB 1GBSetMaxMemory(size string )bool//将value写入缓存Set(key string, val interface{},e…

Softing线上研讨会 | Ethernet-APL:推动数字时代的过程自动化

| &#xff08;免费&#xff09;线上研讨会时间&#xff1a;2024年11月19日 16:00~16:30 / 23:00~23:30 Ethernet-APL以10Mb/s的传输速率为过程工业中的现场设备带来了无缝以太网连接和本质安全电源&#xff0c;这不仅革新了新建工厂&#xff0c;也适用于改造现有工厂。 与现…

《Deep Multimodal Learning with Missing Modality: A Survey》中文校对版

文章汉化系列目录 文章目录 文章汉化系列目录摘要1 引言2 方法论分类&#xff1a;概述2.1 数据处理方面2.2 策略设计方面 3 数据处理方面的方法3.1 模态填充3.1.1 模态组合方法3.1.2 模态生成方法 3.2 面向表示的模型3.2.1 协调表示方法3.2.2 表示组合方法。3.2.3 表示生成方法…

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…

鸿蒙安全控件之位置控件简介

位置控件使用直观且易懂的通用标识&#xff0c;让用户明确地知道这是一个获取位置信息的按钮。这满足了授权场景需要匹配用户真实意图的需求。只有当用户主观愿意&#xff0c;并且明确了解使用场景后点击位置控件&#xff0c;应用才会获得临时的授权&#xff0c;获取位置信息并…

MATLAB矩阵元素的修改及删除

利用等号赋值来进行修改 A ( m , n ) c A(m,n)c A(m,n)c将将矩阵第 m m m行第 n n n列的元素改为 c c c&#xff0c;如果 m m m或 n n n超出原来的行或列&#xff0c;则会自动补充行或列&#xff0c;目标元素改为要求的&#xff0c;其余为 0 0 0 A ( m ) c A(m)c A(m)c将索引…

网络安全之内网安全

下面给出了应对企业内网安全挑战的10种策略。这10种策略即是内网的防御策略&#xff0c;同时也是一个提高大型企业网络安全的策略。 1、注意内网安全与网络边界安全的不同 内网安全的威胁不同于网络边界的威胁。网络边界安全技术防范来自Internet上的攻击&#xff0c;主要是防…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序&#xff0c;用于从网站抓取数据。Python 凭借其丰富的库和简单的语法&#xff0c;是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识&#xff0c;并实现一个简单的爬虫项目。 1. 什么是网络爬虫&#xff1f; 网络爬虫&#x…

solr 远程命令执行 (CVE-2019-17558)

目录 漏洞描述 执行漏洞py脚本&#xff0c;取得shell连接 EXP 漏洞描述 Apache Velocity是一个基于Java的模板引擎&#xff0c;它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目&#xff0c;旨在确保Web应用程序在表示层和业…

数据库中的视图

数据库中的视图 什么是视图创建视图使⽤视图修改数据注意事项 删除视图视图的优点 什么是视图 视图是⼀个虚拟的表&#xff0c;它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据&#xff0c;⽽是通过执⾏查询来动态⽣成数据。⽤户可以像操作普通表⼀样使…

爬虫实战:采集知乎XXX话题数据

目录 反爬虫的本意和其带来的挑战目标实战开发准备代码开发发现问题1. 发现问题[01]2. 发现问题[02] 解决问题1. 解决问题[01]2. 解决问题[02] 最终结果 结语 反爬虫的本意和其带来的挑战 在这个数字化时代社交媒体已经成为人们表达观点的重要渠道&#xff0c;对企业来说&…

springboot-vue excel上传导出

数据库 device_manage表 字段&#xff0c;id&#xff0c;workshop,device_number,device_name,device_model,warn_time,expired_time device_warn表 字段&#xff0c;id,warn_time,expired_time 后端 实体类格式 device_manage Data TableName("device_manage"…

【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)

javascript调用本地exe程序 详细操作步骤结果 详细操作步骤 在本地创建一个txt文件依次输入 1.指明所使用注册表编程器版本 Windows Registry Editor Version 5.00这是脚本的第一行&#xff0c;指明了所使用的注册表编辑器版本。这是必需的&#xff0c;以确保脚本能够被正确解…

Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)

目录 一、Zset有序集合类型介绍 二、常见命令 1、ZADD 2、ZCARD 3、ZCOUNT 4、ZRANGE 5、ZREVRANGE 6、ZRANGEBYSCORE 7、ZREVRANGEBYSCORE 8、ZPOPMAX 9、ZPOPMIN 10、ZRANK 11、ZREVRANK 12、ZSCORE 13、ZREM 14、ZREMRANGEBYRANK 15、ZREMRANGEBYSCORE 16…

设计模式之 责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在将多个处理对象通过链式结构连接起来&#xff0c;形成一条处理请求的链条。每个处理对象都有机会处理请求&#xff0c;或者将请求传递给链中的下一个对象。这样&#x…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…

VITE+VUE3+TS环境搭建

前言&#xff08;与搭建项目无关&#xff09;&#xff1a; 可以安装一个node管理工具&#xff0c;比如nvm&#xff0c;这样可以顺畅的切换vue2和vue3项目&#xff0c;以免出现项目跑不起来的窘境。我使用的nvm&#xff0c;当前node 22.11.0 目录 搭建项目 添加状态管理库&…

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…