• 开源一个监听指定IP,端口,并捕获通过此端口消息的类


    using System;

    using System.Text;
    using System.Net.Sockets;
    using System.Net;

    namespace myClass
    {
        class clsListenPort
        {
            #region 使用说明
            /*
                用途:监听某IP,指定端口,捕获通过此端口的消息。
                举例:
                private delegate void ListenPostModel(string strData);//监听端口
                    
                myClass.clsListenPort myListenPort = new myClass.clsListenPort("LocalHost",8008);
                myListenPort.GetMessage += new myClass.clsListenPort.GetMessageEventHandler(m_GetMessage);
                myListenPort.GetMessageError += new myClass.clsListenPort.GetMessageErrorEventHandler(m_GetMessageError);
                myListenPort.m_StartDoListen();//开始监听

                //捕获到消息事件
                private void m_GetMessage(myClass.clsListenPort sender, string data)
                {
                    ListenPostModel dh = new ListenPostModel(m_ProcessMsg); //invokes为方法名
                    this.Invoke(dh, new object[] { data });// step3 调用invoke
                }

                private void m_ProcessMsg(string strMessage)
                {
                    lst网络通信.Items.Add(strMessage);//显示通信消息
                }

                //Error消息事件
                private void m_GetMessageError(myClass.clsListenPort sender, string data)
                {
                    ListenPostModel dh = new ListenPostModel(m_ProcessMsgError); //invokes为方法名
                    this.Invoke(dh, new object[] { data });// step3 调用invoke
                }

                private void m_ProcessMsgError(string strMessage)
                {
                    lst网络通信1.Items.Add(strMessage);//显示通信消息
                }
               
                //关闭监听,停止线程
                if (myListenPort != null)
                {
                    myListenPort.m_Close();
                }
             */
            #endregion

            #region 私有变量
            private bool bolIsListen = true;
            private string strIPAddress;//IP地址
            private int intPost;//端口
            #endregion

            #region 委托,事件
            //捕获到消息
            public delegate void GetMessageEventHandler(clsListenPort sender, string Data);
            private GetMessageEventHandler GetMessageEvent;

            public event GetMessageEventHandler GetMessage
            {
                add
                {
                    GetMessageEvent = (GetMessageEventHandler)System.Delegate.Combine(GetMessageEvent, value);
                }
                remove
                {
                    GetMessageEvent = (GetMessageEventHandler)System.Delegate.Remove(GetMessageEvent, value);
                }
            }
            //异常
            public delegate void GetMessageErrorEventHandler(clsListenPort sender, string Data);
            private GetMessageErrorEventHandler GetMessageErrorEvent;

            public event GetMessageErrorEventHandler GetMessageError
            {
                add
                {
                    GetMessageErrorEvent = (GetMessageErrorEventHandler)System.Delegate.Combine(GetMessageErrorEvent, value);
                }
                remove
                {
                    GetMessageErrorEvent = (GetMessageErrorEventHandler)System.Delegate.Remove(GetMessageErrorEvent, value);
                }
            }
            #endregion

            public clsListenPort(string IPAddress, int Post)
            {
                strIPAddress = IPAddress;
                intPost = Post;
            }

            /// <summary>
            /// 开始后台线程,开始侦听网络/端口
            /// </summary>
            public void m_StartDoListen()
            {
                System.Threading.Thread listenerThread = new System.Threading.Thread(new System.Threading.ThreadStart(m_DoListen));
                listenerThread.Start();
            }

            /// <summary>
            /// 开始监听
            /// </summary>
            public void m_DoListen()
            {
                try
                {
                    Socket ssock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    IPAddress hostIp = Dns.GetHostEntry(strIPAddress).AddressList[0];
                    IPEndPoint ep = new IPEndPoint(hostIp, intPost);
                    ssock.Bind(ep); //绑定

                    ssock.Listen(32); //开始侦听

                    while (bolIsListen)
                    {
                        Socket sock = ssock.Accept(); //等待客户端请求
                        string file="";
                        try
                        {
                            file = getRequest(sock);

                            if (file == "ShutdownListener")//停止侦听,释放端口
                            {
                                bolIsListen = false;
                                ssock.Close();//关闭连接
                                break;//退出 循环
                            }

                            if (GetMessageEvent != null)//执行事件
                                GetMessageEvent(this, file);         
                        }
                        catch (Exception ex)
                        {
                            if (GetMessageErrorEvent != null)//执行事件
                                GetMessageErrorEvent(this, ex.Message);
                        }
                        finally
                        {
                            sock.Shutdown(SocketShutdown.Both);//关闭连接
                            sock.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (GetMessageErrorEvent != null)//执行事件
                        GetMessageErrorEvent(this, ex.Message);
                }
            }

            /// <summary>
            /// //停止侦听,释放端口,释放资源
            /// </summary>
            public void m_Close()
            {
                try
                {
                    System.Windows.Forms.WebBrowser myWeb = new System.Windows.Forms.WebBrowser();
                    string strPath = "http://" + strIPAddress + ":" + intPost.ToString() + "/ShutdownListener";
                    myWeb.Navigate(strPath);//http://localhost:8008/ShutdownListener");
                }
                catch (Exception ex)
                {
                     if (GetMessageErrorEvent != null)//执行事件
                        GetMessageErrorEvent(this, ex.Message);
                }
            }

            /// <summary>
            /// 读取请求信息,返回客户端请求的文件名
            /// </summary>
            /// <returns></returns>
            private string getRequest(Socket sock)
            {
                string s = null;
                byte[] buff = new byte[1024];
                int recCount = 0;
                try
                {
                    //从socket读取请求信息
                    recCount = sock.Receive(buff, buff.Length, SocketFlags.None);
                    s = ASCIIEncoding.ASCII.GetString(buff, 0, recCount);

                    if (s.IndexOf("GET") > -1)
                    {
                        s = s.Substring(5);
                        int fend = s.IndexOf(" ");
                        s = s.Substring(0, fend); //取得请求文件的路径及文件名
                    }
                    return ProcessString(s);
                }
                catch (Exception ex)
                {
                    if (GetMessageErrorEvent != null)//执行事件
                        GetMessageErrorEvent(this, ex.Message);
                }
                return "";
            }

            /// <summary>
            /// 把客户端请求文件中的字符替换掉
            /// </summary>
            /// <param name="input">要处理的字符串</param>
            /// <returns></returns>
            private string ProcessString(string input)
            {
                StringBuilder result = new StringBuilder();
                for (int i = 0; i < input.Length; i++)
                {
                    if (input[i] == '/')
                    {
                        result.Append('\\');
                    }
                    else
                    {
                        result.Append(input[i]);
                    }
                }
                return result.ToString();
            }
        }
    }

  • 相关阅读:
    IntelliJ IDEA设置JVM运行参数
    IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)
    188.索引与视图
    187.数据库操作
    186.元素
    185.流程设计
    184.数据操纵语言DML
    改变linux shell前景色和背景色
    Centos文本方式安装情况下lvm分区的创建
    深入理解计算机系统第二版习题解答CSAPP 2.20
  • 原文地址:https://www.cnblogs.com/hailexuexi/p/1780204.html
Copyright © 2020-2023  润新知