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

 

上篇中使用了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通讯(一):同步方式

 

posted on 2011-04-01 14:45  o0myself0o  阅读(1551)  评论(1编辑  收藏  举报

导航