zoukankan      html  css  js  c++  java
  • 利用线程池实现多客户端和单服务器端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通讯(一):同步方式

  • 相关阅读:
    PHP:第一章——PHP中的goto语句和
    PHP:第二章——PHP中的foreach语句
    Swingr的JTextField、JPasswordField设置圆角输入框
    Jtabbedpane设置透明、Jpanel设置透明
    去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本
    使用java以及jdbc不使用第三方库执行sql文件脚本
    JButton ButtonClickTest
    Md5加密
    JButton变换样式
    grub2详解(翻译和整理官方手册)
  • 原文地址:https://www.cnblogs.com/myself/p/2002142.html
Copyright © 2011-2022 走看看