legongju.com
我们一直在努力
2025-01-11 18:07 | 星期六

如何使用C# Socket进行异步通信

在C#中,使用Socket进行异步通信可以提高程序的性能和响应能力

  1. 引入必要的命名空间:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
  1. 创建一个类,用于处理异步通信:
public class AsyncSocketServer
{
    private Socket _serverSocket;
    private const int BufferSize = 1024;

    public void StartListening(int port)
    {
        // 创建一个TCP/IP套接字
        _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 绑定到本地端口
        IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
        _serverSocket.Bind(localEndPoint);

        // 开始监听客户端连接
        _serverSocket.Listen(100);

        Console.WriteLine($"服务器正在监听端口 {port}...");

        // 等待客户端连接
        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket);
    }

    private void AcceptCallback(IAsyncResult ar)
    {
        // 获取服务器套接字
        Socket serverSocket = (Socket)ar.AsyncState;

        // 接受客户端连接
        Socket clientSocket = serverSocket.EndAccept(ar);

        // 打印客户端信息
        Console.WriteLine($"客户端 {clientSocket.RemoteEndPoint} 已连接");

        // 准备接收数据的缓冲区
        byte[] buffer = new byte[BufferSize];

        // 开始异步接收数据
        clientSocket.BeginReceive(buffer, 0, BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);

        // 继续等待其他客户端连接
        serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);
    }

    private void ReceiveCallback(IAsyncResult ar)
    {
        // 获取客户端套接字
        Socket clientSocket = (Socket)ar.AsyncState;

        try
        {
            // 结束异步接收操作
            int bytesRead = clientSocket.EndReceive(ar);

            if (bytesRead > 0)
            {
                // 解码接收到的数据
                string receivedData = https://www.yisu.com/ask/Encoding.ASCII.GetString(buffer, 0, bytesRead);"从客户端 {clientSocket.RemoteEndPoint} 接收到数据: {receivedData}");

                // 准备发送的数据
                byte[] sendBuffer = Encoding.ASCII.GetBytes("你好,我是服务器!");

                // 开始异步发送数据
                clientSocket.BeginSend(sendBuffer, 0, sendBuffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), clientSocket);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"接收数据时出错: {ex.Message}");
            clientSocket.Close();
        }
    }

    private void SendCallback(IAsyncResult ar)
    {
        // 获取客户端套接字
        Socket clientSocket = (Socket)ar.AsyncState;

        try
        {
            // 结束异步发送操作
            int bytesSent = clientSocket.EndSend(ar);

            // 打印发送的数据长度
            Console.WriteLine($"向客户端 {clientSocket.RemoteEndPoint} 发送了 {bytesSent} 字节的数据");

            // 准备接收下一批数据的缓冲区
            byte[] buffer = new byte[BufferSize];

            // 开始异步接收数据
            clientSocket.BeginReceive(buffer, 0, BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发送数据时出错: {ex.Message}");
            clientSocket.Close();
        }
    }
}
  1. 在主程序中使用AsyncSocketServer类:
class Program
{
    static void Main(string[] args)
    {
        AsyncSocketServer server = new AsyncSocketServer();
        server.StartListening(8080);

        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }
}

这个示例展示了如何使用C# Socket进行异步通信。当客户端连接到服务器时,服务器会异步接收客户端发送的数据,并将数据原样发送回客户端。你可以根据需要修改此示例以实现更复杂的通信功能。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/101987.html

相关推荐

  • c#覆盖父类方法是什么

    c#覆盖父类方法是什么

    在C#中,子类可以通过使用override关键字来覆盖父类的方法
    using System; class ParentClass
    { public virtual void PrintMessage() { Console.WriteL...

  • c++中析构函数的作用是什么

    c++中析构函数的作用是什么

    在C++中,析构函数(Destructor)是一种特殊类型的成员函数,它在对象的生命周期结束时被自动调用 清理资源:如果对象在其生命周期中分配了动态内存、打开了文件...

  • c++ const作用是什么

    c++ const作用是什么

    在C++中,const关键字主要有以下几个作用: 声明常量:使用const可以声明一个常量,表示该变量的值在程序运行过程中不能被修改。例如:
    const int kConstan...

  • c++如何获取进程名

    c++如何获取进程名

    在 C++ 中,可以使用 Windows API 函数 GetModuleFileName 来获取当前进程的模块文件名(包括路径和文件名)
    #include
    #include
    #include std::s...

  • LAMP架构在新项目中的应用前景如何

    LAMP架构在新项目中的应用前景如何

    LAMP架构,即Linux、Apache、MySQL和PHP的组合,是一种成熟且广泛使用的Web应用开发环境。以下是对LAMP架构在新项目中的应用前景的分析:
    LAMP架构的当前应...

  • 如何备份和恢复LAMP架构的数据

    如何备份和恢复LAMP架构的数据

    LAMP架构的数据备份和恢复是确保数据安全的关键步骤。以下是一些备份和恢复LAMP架构数据的方法和工具:
    备份LAMP架构数据的方法 使用mysqldump备份MySQL数据...

  • 如何在LAMP架构中进行日志管理

    如何在LAMP架构中进行日志管理

    在LAMP架构中进行日志管理,涉及到对Linux系统日志、Apache Web服务器日志、MySQL数据库日志以及PHP应用程序日志的有效收集、分析、存储和可视化。以下是几种常见...

  • 如何扩展LAMP架构以支持高并发

    如何扩展LAMP架构以支持高并发

    要扩展LAMP(Linux、Apache、MySQL和PHP)架构以支持高并发,可以采取以下策略: 优化Apache配置:调整Apache的配置文件(如httpd.conf或apache2.conf),以提高...