问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-30 04:20

我来回答

4个回答

懂视网 时间:2022-04-15 02:53

首先我们了解下关于异步编程的一些知识可以参考我在网上收集的一些资料C#异步Socket编程 我实现了基于异步通信的Socket服务器和客户端程序 下面是我的代码 第一步:首先新建一个服务端项目YBServerWindowsForms 然后在项目里添加一个自定义的类名为StateObje

首先我们了解下关于异步编程的一些知识可以参考我在网上收集的一些资料——C#异步Socket编程

我实现了基于异步通信的Socket服务器和客户端程序

下面是我的代码

第一步:首先新建一个服务端项目YBServerWindowsForms

然后在项目里添加一个自定义的类名为StateObject:

接着是界面设计代码ServerForm.Designer.cs

主要的逻辑控制代码ServerForm.cs

第二步 新建一个客户端项目名称为YBClientWindowsForms

下面是界面设计YBClientForm.Designer.cs:

主要的逻辑控制代码YBClientForm.cs:

本程序在Windows 7 下用VS2008调试通过

热心网友 时间:2022-04-15 00:01

这样的写法有点问题:

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[] buffer = new byte[1024];
                int bytesRecevied = socket.Receive(buffer, buffer.Length, SocketFlags.None);
                byte[] messageBytes = new byte[bytesRecevied];
                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;
        }
    }

热心网友 时间:2022-04-15 01:19

在AcceptCallback方法中,一方面要用newSocket.BeginReceive方法开始接收,一方面要调用Socket.BeginAccept继续接收连接尝试。

热心网友 时间:2022-04-15 02:54

很高兴协助你完成朋友
C# SOCKET 异步接收的问题

那么同步与异步分别应用于什么情况呢?假如用户的socket连接数据比较短暂的。一次连接直接发送数据的或客户端比较少的就使用同步假如用户的socket属于长时间连接的就使用异步方式

C# Socket 异步通讯

在异步RecVing方法中有两点可以改进:1)增加异常处理,目的是:即使发生异常也保证Socket能正常工作。2)调用 EndAceept返回的是正在与客户端连接的sockt private static void RecVing(IAsyncResult Result){ //通过 result 获取socket。在这个socket上你启动了BeginAccept操作 Socket socket = Result....

C# C/S网络编程 由于系统缓存空间不足或列队已满,不能执行套接字上的...

// 继续异步接收 ReceiveMsg();// 完成前一次异步接收EndReceive处理 UdpState udpReceiveState = iar.AsyncState as UdpState;//……} 要注意的是:1)Socket异步接收处理过程中用到了.net framework内部线程池,而线程池中线程的数量是有限制的。2)ReceiveMsg中的 while(true)循环是多余的 3)Rec...

C#Socket(tcp)异步批量发送文件问题

测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个...

C#socket异步怎么实现 线程间通信如何实现

基于C#的socket编程的TCP异步实现一、摘要 本篇博文阐述基于TCP通信协议的异步实现。二、实验平台 Visual Studio 2010三、异步通信实现原理及常用方法3.1 建立连接 在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器。相对地,在异步模式下,服务器可以使用BeginAccept方法和End...

C#Socket无连接异步传输

PORT) 这样就形成了一个服务器ENDPOINT(IP+PORT) 然后自己生成一个SOCKET实例 再连接那个服务器ENDPOINT 再通过这个SOCKET实例传输自己的BYTE流 编IM还是很复杂的 尤其是线程和异步调用的问题 SOCKET只是第一步 和网页的那种伪IM完全不一样的 还有什么问题的话可以HI我 不过我也是菜鸟 只能尽力而为了 ...

用Socket做链接的C#服务器和android客户端,不在同一个电脑上就连不上...

socket是通过ip地址和端口号链接的 在同一个局域网内比如有一台服务器,两台客户端。服务器IP:10.0.0.112,开放端口为8888 客户端的socket就应该这样写 socketAddress address=new IntSocketAddress("10.0.0.112",8888);Socket socket=new Socket(address,int); //这句会让你处理异常,可以...

C# socket tcpclient类库编程为什么我只能连在局域网和本机,不可以连...

tcpListener 是监听本地的tcp连接请求的。你要连接别的机器,你用tcpclient去连。对方机器开放的端口,并且有响应程序的,你链接才有效。你可以自己模拟写一个监听的,再写一个请求的。自己连自己看看,你就知道怎么回事了。具体逻辑是,client请求server端,server端的接收到请求后,做出响应。这之间的...

c#socket异步连接后怎样判断连接是否成功

} } private void connCallBack(IAsyncResult ar) { Socket s = (Socket)ar.AsyncState; try { s.EndConnect(ar); isConnected = s.Connected; } catch (Exception ex)

c#socket在使用TCP或UDP异步通信的时候SocketAsyncEventArgs和...

1、在使用SocketAsyncEventArgs进行TCP或UDP通讯的时候最常用的几个成员分别是:Buffer,BufferList,BytesTransferred,SocketError,UserToken,BytesTransferred属性,SetBuffer方法和Completed事件。2、SocketAsyncEventArgs接收和发送数据都需要设置buffer,一般用SetBuffer方法或设置BufferList。通过Completed来查看完成情况,而...

网络编程和网页编程 网络编程socket python网络编程教程 网络编程的网站 python 网络编程 网络编程是做什么的 java的网络编程重要吗 c++网络编程 网络编程之delphi
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
医药销售的人真的很“黑”吗? 往届生考国考有什么限制 白实线变道会被拍吗? 白色实线变道会被拍吗 有没有斗气魔法的穿越小说 时代少年团中谁最大 ...我们活着到底是为什么,不要老是说为别人而活,不要说我有病。_百度... 我今年冬天刚得的慢性咽炎,我是干二氧化碳保护焊的,带防尘口罩,但少量... ...40寸比42寸的贵,谁能稍微给我介绍下液晶电视的一些常识 怎么消灭蚂蚁??? 风行景逸11款半自动挡,挂不上档怎么回事 东风景逸11年二手车1.5排量我买3.8万划算吗? 11年东风景逸xl车主驾底盘跌波路异响怎么回事? 11年的景逸换大灯开关要拆方向盘吗? 东风风行景逸11款手自一体1.5突然觉得费油是什么问题? 黄金是怎样保值的 asme b16.5美标相当与HG&#47;T 2O615 ~ 20635-2009 国家标准,那我要美标的法兰尺寸,可以直接在国家标准找吗 请问目前菜百和国华的千足金多少钱一克?现在收藏贺岁金条是否合适,如何回购? 2011年,东风风行景逸三手车跑9万公里值多少钱 11年东风景逸AMT变速箱冬季挂不上档,挂档时档位灯闪但是没有挡,拆电瓶断电有时好使有时不好使,有_百度问一问 汇源果汁有哪些产品 2011款东风风行景逸1.5XL怎么样 2011款风行景逸怎么样 汇源果汁是国产吗 汇源果汁哪个国家的 11年的景逸x3自动挡值多少钱? 11年的东风景逸手自一体的跑了十万值多少钱? 美标法兰尺寸 MP5冲锋枪的性能参数 村民意外捕获25斤野生甲鱼,甲鱼和龟类的区别在哪里? 东风风行景逸10款和11款的区别是什么 11款东风景逸1.5XL的AUX插口在哪个位置? 11年东风景逸打不着车(1点反应没有)直连起动机能打着挂挡不走道没挡显 我的也是发动机故障码常亮。用仪器检查一切都正常。可故障码却没有办法消失?11年的景逸XL1.5 景逸11款1.5lv是什么波箱 我想问一下2011款景逸1.5XL的发动机 景逸2011款 1.5XL 手动标准型 这车怎么样,开着的兄弟说一下吧 东风景逸1.5,11年买的车,跑了五万公里,最近跑到50以上就嗡嗡响,特别大,空挡滑行声音也不减小 哪里有品质管理行业职位(从事QA,QC,QE,QI,QP,QM之类的职务)的专业培训? 家里有的毛衣大衣容易起球,扔了可惜,不扔也没法穿,应该怎样处理? 豆浆可以放铁锅里煮吗 豆浆可以煮什么汤 豆浆可以和大米一起煮粥吗 害怕黑暗,害怕封闭的空间,一旦处于这种境界就会恐惧得发不出声音。为什么?这是什么病? 什么叫跨接?跨接线是怎么回事? pe跨接线是什么意思 汽车电路跨接线是什么? 请问配电箱门跨接是怎么回事,什么原理,怎么接线的?单纯箱体与箱门相连吗,还是箱体同时再与PE线相连_百度问一问 水电跨接线是什么 iphone x的外屏被压碎了,可以单独换个屏吗?