C# BeginXXX EndXXX 异步Socket服务端

    异步服务端相对于同步服务端,不会造成线程的阻塞。

    在高并发多连接的情况下,比同步多线程具有更大的优势。当然也有缺点,Begin异步无法复用IAsyncResult,每次收发数据都会产生大量的临时对象,对服务端gc回收产生一定的影响。

    BeginXXX(AsyncCallback, object) 

    1.AsyncCallback  参数为IAsyncResult的回调函数, IAsyncResult接口对象有我们需要的Socket句柄等等...

    2.此请求的对象。

    话不多说,上示例。

    服务端:

public class Server
    {
        private Socket _serverSocket;
        private int _prot;
        private int _maxClient;

        public Server(int prot, int maxClient)
        {
            _prot = prot;
            _maxClient = maxClient;
        }

        public void Start()
        {
            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(new IPEndPoint(IPAddress.Any, _prot));
            _serverSocket.Listen(_maxClient);
            StartAccept();
        }

        private void StartAccept()
        {
            _serverSocket.BeginAccept(new AsyncCallback(AcceptRequest), _serverSocket);
        }

        private void AcceptRequest(IAsyncResult ar)
        {
            Socket server = ar.AsyncState as Socket;
            Socket clientSocket = server.EndAccept(ar);
            Console.WriteLine(string.Format("客户端 {0} 连接", clientSocket.RemoteEndPoint));
            Client client = new Client(clientSocket);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptRequest), _serverSocket);
        }

        
    }

    服务端存储的客户端类:

public class Client
    {
        public Socket ClientSocket;
        public byte[] _buff;

        public Client(Socket socket)
        {
            ClientSocket = socket;
            _buff = new byte[1024];
            StartRecv();
        }

        private void StartRecv()
        {
            ClientSocket.BeginReceive(_buff, 0, _buff.Length, 0, RecvRequest, ClientSocket);
        }

        private void RecvRequest(IAsyncResult ar)
        {
            Socket client = ar.AsyncState as Socket;
            int l = client.EndReceive(ar);
            if (l > 0)
            {
                Console.WriteLine(Encoding.Default.GetString(_buff));
            }
        }
    }

本机测试可运行,客户端没有考虑并发,用同步就行了。

如上有问题,欢迎指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要学好 C#异步编程,以下是一些建议: 1. 理解异步编程的概念:异步编程是一种并发编程的方式,可以提高程序的性能和响应能力。了解异步编程的基本原理和概念,包括异步方法、异步委托、任务等。 2. 使用 async 和 await 关键字:C# 提供了 async 和 await 关键字,用于简化异步编程。学习如何使用这些关键字来定义和调用异步方法,以及如何处理异步操作的结果。 3. 掌握 Task 和 Task<T> 类:Task 是 C# 中用于表示异步操作的类,Task<T> 则是带有返回值的异步操作类。了解如何创建、启动和等待任务,以及如何处理任务的结果和异常。 4. 熟悉异步编程模式(APM)和任务并行库(TPL):C# 提供了 APM 和 TPL 两种常用的异步编程模式。学习如何使用 BeginXXXEndXXX 方法来实现 APM,以及如何使用 Parallel 类和并行 LINQ(PLINQ)来实现 TPL。 5. 异常处理和取消操作:在异步编程中,异常处理和取消操作非常重要。学习如何捕获和处理异步操作中可能出现的异常,并了解如何使用 CancellationToken 来取消异步操作。 6. 调试和性能优化:异步编程可能带来一些调试和性能上的挑战。学习如何调试异步代码,并使用适当的技术和工具来优化异步操作的性能。 7. 实践和项目经验:除了理论知识,实践和项目经验也是学习异步编程的关键。尝试编写一些实际的异步代码,并参与或贡献到使用异步编程的项目中,以加深对异步编程的理解和应用。 最重要的是,要不断练习和深入学习,通过阅读相关文档、书籍和参与社区讨论来扩展自己的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值