利用线程池实现多客户端和单服务器端Socket通讯(二):异步编程模型实现

本文介绍了一种基于Socket的异步编程模型实现多客户端与单服务器间的通讯方式。通过使用.NET平台下的Socket类的Begin/End方法组合,实现了客户端与服务器端的数据收发功能,并利用线程池来提高系统的并发处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

上篇中使用了ThreadPool加上Socket同步方式实现多客户端和单服务器端通讯,稍加修改,得到异步编程模型实现方式

主要使用到Socket的BeginSend, EndSend, BeginAccept, EndAccept, BeginReceive, EndReceive

代码:

// Server端

namespace  SocketAPMServer
{
    
public   partial   class  Form1 : Form
    {
        Socket socket;
        
public  Form1()
        {
            InitializeComponent();
            InitSocket();
        }

        
private   void  InitSocket()
        {
            socket 
=   new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPHostEntry ipHostEntry 
=  Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint ipEndPoint 
=   new  IPEndPoint(ipHostEntry.AddressList[ 3 ],  8092 );
            socket.Bind(ipEndPoint);
            socket.Listen(
20 );
        }

        
private   void  btnBeginRec_Click( object  sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem((_) 
=>
            {
                
while  ( true )
                {
                    Socket socketAccept 
=   null ;
                    
if  (socket.Poll( - 1 , SelectMode.SelectRead))
                    {
                        socket.BeginAccept(arAcpt 
=>  {
                            socketAccept 
=  socket.EndAccept(arAcpt);
                            
if  (socketAccept  !=   null )
                            {
                                ThreadPool.QueueUserWorkItem((o) 
=>
                                {
                                    
while  ( true )
                                    {
                                        
byte [] byteArray  =   new   byte [ 100 ];
                                        socketAccept.BeginReceive(byteArray, 
0 , byteArray.Length, SocketFlags.None, (arRec)  =>  {
                                            socketAccept.EndReceive(arRec);
                                            
string  strRec  =  System.Text.Encoding.UTF8.GetString(byteArray);
                                            
if  ( this .txtMsg.InvokeRequired)
                                            {
                                                
this .txtMsg.Invoke( new  ChangeText(ShowMsg), strRec);
                                            }
                                        }, 
null );
                                        System.Threading.Thread.Sleep(
100 );
                                    }
                                });
                            }
                        }, 
null );
                    }
                }
            });
            System.Threading.Thread.Sleep(
100 );
        }

        
delegate   void  ChangeText( string  obj);
        
private   void  ShowMsg( string  obj)
        {
            
this .txtMsg.AppendText(obj  +   "    " );
        }
    }
}

 

// Client端

namespace  SocketAPMClient
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            Socket socket 
=   new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPHostEntry ipHostEntry 
=  Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint ipEndPoint 
=   new  IPEndPoint(ipHostEntry.AddressList[ 3 ],  8092 );
            socket.Connect(ipEndPoint);

            
while  ( true )
            {
                
string  input  =  Console.ReadLine();
                
try
                {
                    
byte [] buffer  =  System.Text.Encoding.UTF8.GetBytes(input);
                    socket.BeginSend(buffer, 
0 , buffer.Length, SocketFlags.None, (ar)  =>  {
                        socket.EndSend(ar);
                    }, 
null );
                }
                
catch  (Exception ex)
                {
                    
if  (socket  !=   null )
                    {
                        socket.Close();
                    }
                    Console.WriteLine(
" Client Error:  "   +  ex.Message);
                }
                System.Threading.Thread.Sleep(
100 );
            }
        }
    }
}

 

利用线程池实现多客户端和单服务器端Socket通讯(一):同步方式

 

转载于:https://www.cnblogs.com/myself/archive/2011/04/01/2002142.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值