socket编程异步模式(C# Socket 异步通讯)

:暂无数据 2026-07-04 15:40:07 3

socket编程异步模式(C# Socket 异步通讯)

大家好,今天小编来为大家解答以下的问题,关于socket编程异步模式,C# Socket 异步通讯这个很多人还不知道,现在让我们一起来看看吧!

本文目录

C# Socket 异步通讯

这样写异步处理方法没错,异步处理TCP连接就是这样写的!

在异步RecVing方法中有两点可以改进:

1)增加异常处理,目的是:即使发生异常也保证Socket能正常工作。

2)调用 EndAceept返回的是正在与客户端连接的sockt

private static void RecVing(IAsyncResult Result)
{
    //通过 result 获取socket。在这个socket上你启动了BeginAccept操作
    Socket socket = Result.AsyncState as Socket;
    Socket Res_soc = null; //这个是与当前客户端连接的Socket
    Socket_Business business = new Socket_Business(); 
    try
    {
        // 通过EndAccept,获取与当前客户端连接的Socket
         Res_soc  = socket.EndAccept(Result);
        Console.WriteLine("连接成功!");
        byte;
        int i = Res_soc.Receive(bytes);
        string cmdstr = System.Encoding.Default.GetString(bytes, 0, i);
        Console.WriteLine(cmdstr);  
        business.Business(bytes, Res_soc);
        send(Res_soc);
     }
     catch 
     {
         // 发生异常时,释放Res_soc
         if(Res_soc != null) Res_soc = null;
      }
     finally  //利用finally 确保无论发生什么异常都能够让socket继续接收连接
     {
         //继续异步等待连接
         socket.BeginAccept(new AsyncCallback(RecVing), socket);
     }             
}

 另外:楼上“许惘然”的说法是不对的。因为Res_soc是定义在RecVing中的个局部变量,当从RecVing中退出后,这个被变量自动释放掉了。

C# SOCKET 异步接收的问题

socket传输中拿tcp传输为例。假设服务器a
客户机b进行通信传输。首先需要在a机建立监听线程。监听某一端口,那么b机可以向a机发送通讯请求,b机连接到a机以后。a机可以从他的监听队列中取的一个监听对象。在a端拿到了这个socket对象就可以进行接收跟发送数据了。这里问题就出现了。假如b端在请求a端的时候请求成功就发送一条数据。那么
a端就可以直接拿socket对象得到他的信息。但是假如b端并没有在连接成功后直接发送信息而是在后来不确定的时间这内发送的信息。那么a端就无法得到这条信息。通常的做法是用一个定时器去不短的扫描这个数据缓存区。看是不是有数据存在这样效率非常低下。那么如何解决这个问题呢。就用到了我们的异步传输。异步传输的原理是。在a端得到这个socket对象以后并不是直接去接收数据而是建立一个回调函数。回调函数是由系统维护的。他在指定的时间自动去扫描数据存储区。假如有数据他就把数据存储到指定的字节数组中。不用用户自己去关心。
那么同步与异步分别应用于什么情况呢?假如用户的socket连接数据比较短暂的。一次连接直接发送数据的或客户端比较少的就使用同步假如用户的socket属于长时间连接的就使用异步方式

luasocket怎么异步connect

这个是C#的东西。 函数原型如下: public IAsyncResult BeginConnect( EndPoint remoteEP, AsyncCallback callback, Object state ) public bool ConnectAsync( SocketAsyncEventArgs e ) 他们都开始一个对远程主机连接的异步请求。

关于c#的Socket异步网络编程问题

这样的写法有点问题:

1)服务器端既然采用了异步方式Accept,就没有必要再启线程

2)估计allDone是一个ManualResetEvent。用ManualResetEvent的目的什么呢?

服务器端采用异步Accept的代码其实很简单,也不需要ManualResetEvent同步

   public class AppTCPServer
    {
        public AppTCPServer(string localIP, int port)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, 
                                                        SocketType.Stream, 
                                                        ProtocolType.Tcp);
            EndPoint localEP = new IPEndPoint(IPAddress.Parse(localIP), port);
            socket.Bind(localEP);
            socket.Listen(100);
            socket.BeginAccept(AcceptAsync, socket);
        }
        private void AcceptAsync(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            try
            {
                Socket client = socket.EndAccept(ar);
                Console.WriteLine("客户端连接成功!客户端:{0}", client.RemoteEndPoint.ToString());
                if (OnConnected != null)
                {
                    OnConnected(this, new ClientConnectedEventArgs(client));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("AcceptAsync发生异常,异常信息:\n{0}", e.Message);
            }
            finally
            {
                //继续异步Accept
                socket.BeginAccept(AcceptAsync, socket);
            }
        }
        //客户端连接后的事件 OnConnect
        public event EventHandler《ClientConnectedEventArgs》 OnConnected;
    }
    /// 《summary》
    /// 事件参数:接收客户端连接后的事件参数
    /// 《/summary》
    public class ClientConnectedEventArgs : EventArgs
    {
        public ClientConnectedEventArgs(Socket clientSocket)
        {
            ClientSocket = clientSocket;
        }
        public Socket ClientSocket { get; private set; }
    }
    
    class Program
    {
        static void Main(string args)
        {
            AppTCPServer server = new AppTCPServer("127.0.0.01", 8000);
            server.OnConnected += server_OnConnected;
            Console.WriteLine("按任意键结束程序……");
            Console.ReadKey();
        }
        static void server_OnConnected(object sender, ClientConnectedEventArgs e)
        {
            Socket client = e.ClientSocket;
            string hello = "Hello from AppTCPServer";
            client.Send(Encoding.Default.GetBytes(hello));
        }
    }

 客户端测试程序

   class Program
    {
        static void Main(string args)
        {
            //模拟100个客户连接服务器
            for (int i = 0; i 《 100; i++)
            {
                Socket socket = ConnectToServer("127.0.0.1", 8000);
                byte;
                int bytesRecevied = socket.Receive(buffer, buffer.Length, SocketFlags.None);
                byte;
                Array.Copy(buffer, messageBytes, bytesRecevied);
                Console.WriteLine(Encoding.Default.GetString(messageBytes));
                socket.Disconnect(false);
                socket.Close();
            }
            Console.ReadKey();
        static Socket ConnectToServer(string serverIP, int serverPort)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint localEP = new IPEndPoint(IPAddress.Any, 0);
            socket.Bind(localEP);
            socket.Connect(new IPEndPoint(IPAddress.Parse(serverIP), serverPort));
            return socket;
        }
    }

关于socket编程异步模式,C# Socket 异步通讯的介绍到此结束,希望对大家有所帮助。

socket编程异步模式(C# Socket 异步通讯)

本文编辑:admin

更多文章:


send out用法及例句(send out是什么意思)

send out用法及例句(send out是什么意思)

各位老铁们好,相信很多人对send out用法及例句都不是特别的了解,因此呢,今天就来为大家分享下关于send out用法及例句以及send out是什么意思的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年9月7日 20:30

全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)

全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)

大家好,关于全球新冠肺炎疫情背景下航运发展很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决

2026年9月7日 17:10

matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)

matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)

大家好,关于matlab求解带字母参数方程组很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数的知识点,相信应该可以解决大家的一些困惑和问题,

2026年9月7日 16:30

oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)

oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)

本篇文章给大家谈谈oracle中的循环语句,以及下面哪个不是oracle程序设计中的循环语句 a for对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月7日 15:30

多表查询怎么做(Excel技巧:如何多表同步筛选)

多表查询怎么做(Excel技巧:如何多表同步筛选)

各位老铁们好,相信很多人对多表查询怎么做都不是特别的了解,因此呢,今天就来为大家分享下关于多表查询怎么做以及Excel技巧:如何多表同步筛选的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年9月7日 15:10

服装店网站网页设计(服装网站建设目标设计要看甲方)

服装店网站网页设计(服装网站建设目标设计要看甲方)

“服装店网站网页设计”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看服装店网站网页设计(服装网站建设目标设计要看甲方)!

2026年9月7日 14:10

电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)

电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)

大家好,电脑里2个系统怎么删除一个相信很多的网友都不是很明白,包括电脑开机显示有两个系统,如何删除一个也是一样,不过没有关系,接下来就来为大家分享关于电脑里2个系统怎么删除一个和电脑开机显示有两个系统,如何删除一个的一些知识点,大家可以关注

2026年9月7日 12:20

苹果手机代码大全(恢复更新固件iOS未知错误代码解决大全)

苹果手机代码大全(恢复更新固件iOS未知错误代码解决大全)

大家好,今天小编来为大家解答以下的问题,关于苹果手机代码大全,恢复更新固件iOS未知错误代码解决大全这个很多人还不知道,现在让我们一起来看看吧!

2026年9月7日 10:20

scrollthrough意思(“scroll”是什么意思)

scrollthrough意思(“scroll”是什么意思)

今天给各位分享“scroll”是什么意思的知识,其中也会对“scroll”是什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月7日 08:00

怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)

怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)

本篇文章给大家谈谈怎么激活keygen,以及注册机如何激活cad2008一个简单激活cad2008的方法对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站

2026年9月7日 06:30

最近更新

热门文章

dessert(dessert是什么意思)
2026-05-03 12:45:03 浏览:7
标签列表