Socket编程 (异步通讯) (Tcp,Udp) - Part2

上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。至于一个服务器对应多个客户端,或者对应多个请求,我们采用的是多线程的方式来解决此问题。然而本章节我们将有更好的方式去实现它:Socket在Tcp\Udp两种协议下的异步通讯方式。

基于Tcp协议异步:

BeginAccept方法和EndAccept方法

包含在System.Net.Sockets命名空间下。异步Tcp使用BeginAccept方法开始接受新的客户端连接请求,该方法中系统自动利用线程池创建需要的线程,并在操作完成时利用异步回调机制调用提供给它的方法,同时返回相应的状态参数,然后方可利用EndAccept方法结束该连接请求.

BeginRecive方法和EndRecive方法

异步Tcp使用BeginRecive方法和开始接受客户端发送的的消息,该方法如上同理,接受完毕后调用回调函数传递相应的状态参数。利用EndRecive方法接受接受消息。

至于BeginSend方法和EndSend方法、BeginConnect方法和EndConnect方法与上类似。

下面我们来看看如何在Tcp协议下进行客户端与服务器端之间的通讯:

1、服务端

using System;
using System.Collections.Generic;
using System.Text;
#region 命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;
#endregion

namespace AsynServerConsole
{
   
    /// 
    /// Tcp协议异步通讯类(服务器端)
    /// 
    public class AsynTcpServer
    {
   
        #region Tcp协议异步监听
        /// 
        /// Tcp协议异步监听
        /// 
        public void StartListening()
        {
   
            //主机IP
            IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8686);
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            tcpServer.Bind(serverIp);
            tcpServer.Listen(100);
            Console.WriteLine("异步开启监听...");
            AsynAccept(tcpServer);
        }
        #endregion

        #region 异步连接客户端
        /// 
        /// 异步连接客户端
        /// 
        /// 
        public void AsynAccept(Socket tcpServer)
        {
   
            tcpServer.BeginAccept(asyncResult =>
            {
   
                Socket tcpClient = tcpServer.EndAccept(asyncResult);
                Console.WriteLine("server<--<--{0}", tcpClient.RemoteEndPoint.ToString());
                AsynSend(tcpClient, "收到连接...");//发送消息
                AsynAccept(tcpServer);
                AsynRecive(tcpClient);
            }, null);
        }
        #endregion

        #region 异步接受客户端消息
        /// 
        /// 异步接受客户端消息
        /// 
        /// 
        public void AsynRecive(Socket tcpClient)
        {
   
            byte[] data = new byte[1024];
            try
            {
   
                tcpClient.BeginReceive(data, 0, data.Length, SocketFlags.None,
                asyncResult =>
                {
   
                    int length = tcpClient.EndReceive(asyncResult);
                    Console.WriteLine("server<--<--client:{0}", Encoding.UTF8.GetString(data));
                    AsynSend(tcpClient, "收到消息...");
                    AsynRecive(tcpClient);
                }, null);
            }
            catch (Exception ex)
            {
   
                Console.WriteLine("异常信息:", ex.Message

你可能感兴趣的:(Socket,tcp/ip,udp,网络)