예제 #1
0
 /// <summary>
 /// �������,�Ѿ������ʧ��
 /// </summary>
 /// <param name="port">�˿ں�</param>
 /// <param name="server">������</param>
 public void Start(int port, ServerBase server)
 {
     if (port < 1024 || null == server)
         return;
     if (this.listenermap.ContainsKey(port))
         return;
     ThreadManager.QueueUserWorkItem(delegate(object obj) { this.start(port, server); }, null);
 }
예제 #2
0
 /// <summary>
 /// �������,�Ѿ���������,��ռ������Լ�������
 /// </summary>
 /// <param name="port">�˿ں�</param>
 /// <param name="server">������</param>
 private void start(int port, ServerBase server)
 {
     if (port < 1024 || null == server)
         return;
     if (this.listenermap.ContainsKey(port))
         return;
     server.Port = port;
     IPEndPoint localport = new IPEndPoint(IPAddress.Any, port);
     TcpListener listener = new TcpListener(localport);
     this.listenermap.Add(port, listener);
     try
     {
         listener.Start();
     }
     catch
     {
         this.listenermap.Remove(port);
         return;
     }
     while (true)
     {
         Socket client = null;
         try
         {
             client = listener.AcceptSocket();
         }
         catch (Exception ex)
         {
             ErrorRequestEventArgs args = new ErrorRequestEventArgs(client, server, new byte[0], ex);
             this.raiseEvent(args);
             if (!this.listenermap.ContainsKey(port))
                 return;
             listener.Start();
             continue;
         }
         ClientInfo info = new ClientInfo(client);
         Monitor.Enter(server);
         server.ClientList.Add(info);
         Monitor.PulseAll(server);
         Monitor.Exit(server);
         ThreadManager.QueueUserWorkItem(delegate(object obj) { this.readData(info, server); }, null);
         ThreadManager.QueueUserWorkItem(delegate(object obj) { this.writeData(info, server); }, null);
     }
 }
예제 #3
0
 /// <summary>
 /// ������д��ͨѶ����
 /// </summary>
 /// <param name="client">�ͻ�������</param>
 /// <param name="server">������</param>
 private void writeData(ClientInfo clientinfo, ServerBase server)
 {
     if (null == clientinfo || null == server)
         return;
     Socket client = clientinfo.Client;
     List<byte[]> responseList = clientinfo.BufferResponse;
     while (true)
     {
         //������ʱ�ر��˳�
         if (DateTime.Now - clientinfo.OPdt > server.TimeDisconn)
         {
             this.closeClientInfo(clientinfo, server);
             DisconnEventArgs args = new DisconnEventArgs(client, server);
             this.raiseEvent(args);
             return;
         }
         for (int i = 0; i < 80; i++)
         {
             if (responseList.Count > 0)
                 break;
             Thread.Sleep(5);
         }
         if (responseList.Count < 1)
             continue;
         //ͬ���¼�����������Ӧ����
         clientinfo.OPdt = DateTime.Now;
         Monitor.Enter(clientinfo);
         byte[][] responseArray = responseList.ToArray();
         responseList.Clear();
         Monitor.PulseAll(clientinfo);
         Monitor.Exit(clientinfo);
         try
         {
             for (int i = 0; i < responseArray.Length; i++)
             {
                 client.Send(responseArray[i]);
                 ResponseSrvEventArgs argresp = new ResponseSrvEventArgs(client, server, responseArray[i]);
                 this.raiseEvent(argresp);
             }
         }
         catch (Exception ex)
         {
             this.closeClientInfo(clientinfo, server);
             DisconnEventArgs args = new DisconnEventArgs(client, server, ex);
             this.raiseEvent(args);
             return;
         }
         clientinfo.OPdt = DateTime.Now;
     }
 }
예제 #4
0
        /// <summary>
        /// �رտͻ������Ӳ��ͷŻ�����Ϣ
        /// </summary>
        /// <param name="clientinfo"></param>
        /// <param name="server"></param>
        private void closeClientInfo(ClientInfo clientinfo, ServerBase server)
        {
            try
            {
                clientinfo.Client.Close();
                Monitor.Enter(clientinfo);
                clientinfo.BufferResponse.Clear();
                Monitor.PulseAll(clientinfo);
                Monitor.Exit(clientinfo);

                Monitor.Enter(server);
                server.ClientList.Remove(clientinfo);
                Monitor.PulseAll(server);
                Monitor.Exit(server);
            }
            catch { }
        }
예제 #5
0
        /// <summary>
        /// ��������ȡͨѶ����
        /// </summary>
        /// <param name="client">�ͻ�������</param>
        /// <param name="server">������</param>
        private void readData(ClientInfo clientinfo, ServerBase server)
        {
            if (null == clientinfo || null == server)
                return;
            Socket client = clientinfo.Client;
            bool isopen = false;
            int iM = 1048576, available = 0;
            try
            {
                isopen = client.Connected;
                available = isopen ? client.Available : 0;
            }
            catch { return; }

            List<byte[]> responseList = clientinfo.BufferResponse;
            byte[] buffer = new byte[client.ReceiveBufferSize];
            MemoryStream stream = new MemoryStream();
            byte[] b = null;
            while (true)
            {
                while (available > 0)
                {
                    try
                    {
                        //ִ������
                        byte[] request = stream.ToArray();
                        long pos = stream.Position;
                        int len = client.Receive(buffer);
                        available = client.Available;
                        clientinfo.OPdt = DateTime.Now;
                        if (request.Length > 0)
                        {
                            stream = new MemoryStream();
                            long lenr = request.LongLength;
                            for (int i = 0; i * iM < lenr; i++)
                                stream.Write(request, iM * i, lenr > (i + 1) * iM ? iM : (int)(lenr - i * iM));
                        }
                        stream.Seek(pos, SeekOrigin.Begin);
                        byte[] reqarg = new byte[len];
                        Array.Copy(buffer, reqarg, len);
                        RequestEventArgs argreq = new RequestEventArgs(client, server, reqarg);
                        this.raiseEvent(argreq);
                        b = server.Execute(clientinfo, buffer, len, ref stream);
                    }
                    catch (Exception ex)
                    {
                        byte[] request = stream.ToArray();
                        stream = new MemoryStream();
                        ErrorRequestEventArgs argerr = new ErrorRequestEventArgs(client, server, request, ex);
                        this.raiseEvent(argerr);
                        if (ex is SocketException)
                        {
                            isopen = false;
                            break;
                        }
                        continue;
                    }
                    //��Ӧ���д�뻺��,����ͬ���¼�д����Ӧ
                    if (null != b && b.Length > 0)
                    {
                        Monitor.Enter(clientinfo);
                        responseList.Add(b);
                        Monitor.PulseAll(clientinfo);
                        Monitor.Exit(clientinfo);
                    }
                }//while (available > 0)
                while(available < 1)
                {
                    Thread.Sleep(10);
                    try
                    {
                        isopen = client.Connected;
                        available = isopen ? client.Available : 0;
                        if (!isopen) break;
                    }
                    catch
                    {
                        available = 0;
                        isopen = false;
                        break;
                    }
                }
                if (!isopen)
                {
                    this.closeClientInfo(clientinfo, server);
                    return;
                }
            }//while (true)
        }
예제 #6
0
 /// <summary>
 /// 请求事件参数构造函数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器服务实例</param>
 /// <param name="ex">异常事件</param>
 public DisconnEventArgs(Socket client, ServerBase server,Exception ex)
 {
     Client = client;
     Server = server;
     Exception = ex;
 }
예제 #7
0
 /// <summary>
 /// 请求事件参数构造函数
 /// </summary>
 /// <param name="server">服务器服务实例</param>
 /// <param name="client">客户端实例</param>
 /// <param name="request">请求数据内容</param>
 public ExtendEventArgs(ServerBase server, ClientInfo client, byte[] request)
 {
     Server = server;
     Client = client;
     Request = request;
     if (null != request)
         ContentLen = request.Length;
 }
예제 #8
0
 /// <summary>
 /// 服务器端异常事件参数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器服务实例</param>
 /// <param name="request">请求数据内容</param>
 /// <param name="ex">服务端异常</param>
 public ErrorRequestEventArgs(Socket client, ServerBase server, byte[] request,Exception ex)
 {
     Client = client;
     Server = server;
     Request = request;
     if (null != request)
         ContentLen = request.Length;
     Exception = ex;
 }
예제 #9
0
 /// <summary>
 /// 请求事件参数构造函数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器服务实例</param>
 public DisconnEventArgs(Socket client, ServerBase server)
 {
     Client = client;
     Server = server;
 }
예제 #10
0
 /// <summary>
 /// 请求事件参数构造函数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器服务实例</param>
 /// <param name="request">请求数据内容</param>
 public RequestEventArgs(Socket client, ServerBase server, byte[] request)
 {
     Client = client;
     Server = server;
     Request = request;
     if (null != request)
         ContentLen = request.Length;
 }
예제 #11
0
 /// <summary>
 /// 服务端响应事件参数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器实例</param>
 /// <param name="response">响应数据</param>
 public ResponseSrvEventArgs(Socket client, ServerBase server, byte[] response)
 {
     Client = client;
     Server = server;
     Response = response;
     if (null != response)
         ContentLen = response.Length;
 }
예제 #12
0
 /// <summary>
 /// 请求事件参数构造函数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器服务实例</param>
 /// <param name="ex">异常事件</param>
 public DisconnEventArgs(Socket client, ServerBase server, Exception ex)
 {
     Client    = client;
     Server    = server;
     Exception = ex;
 }
예제 #13
0
 /// <summary>
 /// 请求事件参数构造函数
 /// </summary>
 /// <param name="client">发出请求的客户端</param>
 /// <param name="server">服务器服务实例</param>
 public DisconnEventArgs(Socket client, ServerBase server)
 {
     Client = client;
     Server = server;
 }
예제 #14
0
        /// <summary>
        /// 服务器读取通讯数据
        /// </summary>
        /// <param name="client">客户端连接</param>
        /// <param name="server">服务器</param>
        private void readData(ClientInfo clientinfo, ServerBase server)
        {
            if (null == clientinfo || null == server)
            {
                return;
            }
            Socket client = clientinfo.Client;
            bool   isopen = false;
            int    iM = 1048576, available = 0;

            try
            {
                isopen    = client.Connected;
                available = isopen ? client.Available : 0;
            }
            catch { return; }

            List <byte[]> responseList = clientinfo.BufferResponse;

            byte[]       buffer        = new byte[client.ReceiveBufferSize];
            MemoryStream stream        = new MemoryStream();

            byte[] b = null;
            while (true)
            {
                while (available > 0)
                {
                    try
                    {
                        //执行请求
                        byte[] request = stream.ToArray();
                        long   pos     = stream.Position;
                        int    len     = client.Receive(buffer);
                        available       = client.Available;
                        clientinfo.OPdt = DateTime.Now;
                        if (request.Length > 0)
                        {
                            stream = new MemoryStream();
                            long lenr = request.LongLength;
                            for (int i = 0; i *iM < lenr; i++)
                            {
                                stream.Write(request, iM * i, lenr > (i + 1) * iM ? iM : (int)(lenr - i * iM));
                            }
                        }
                        stream.Seek(pos, SeekOrigin.Begin);
                        byte[] reqarg = new byte[len];
                        Array.Copy(buffer, reqarg, len);
                        RequestEventArgs argreq = new RequestEventArgs(client, server, reqarg);
                        this.raiseEvent(argreq);
                        b = server.Execute(clientinfo, buffer, len, ref stream);
                    }
                    catch (Exception ex)
                    {
                        byte[] request = stream.ToArray();
                        stream = new MemoryStream();
                        ErrorRequestEventArgs argerr = new ErrorRequestEventArgs(client, server, request, ex);
                        this.raiseEvent(argerr);
                        if (ex is SocketException)
                        {
                            isopen = false;
                            break;
                        }
                        continue;
                    }
                    //响应结果写入缓存,触发同步事件写入响应
                    if (null != b && b.Length > 0)
                    {
                        Monitor.Enter(clientinfo);
                        responseList.Add(b);
                        Monitor.PulseAll(clientinfo);
                        Monitor.Exit(clientinfo);
                    }
                }//while (available > 0)
                while (available < 1)
                {
                    Thread.Sleep(10);
                    try
                    {
                        isopen    = client.Connected;
                        available = isopen ? client.Available : 0;
                        if (!isopen)
                        {
                            break;
                        }
                    }
                    catch
                    {
                        available = 0;
                        isopen    = false;
                        break;
                    }
                }
                if (!isopen)
                {
                    this.closeClientInfo(clientinfo, server);
                    return;
                }
            }//while (true)
        }
예제 #15
0
 /// <summary>
 /// 服务器写入通讯数据
 /// </summary>
 /// <param name="client">客户端连接</param>
 /// <param name="server">服务器</param>
 private void writeData(ClientInfo clientinfo, ServerBase server)
 {
     if (null == clientinfo || null == server)
         return;
     Socket client = clientinfo.Client;
     List<byte[]> responseList = clientinfo.BufferResponse;
     while (true)
     {
         //心跳超时关闭退出
         if (DateTime.Now - clientinfo.OPdt > server.TimeDisconn)
         {
             server.Close(clientinfo);
             //string msgex = "心跳超时退出,剩余连接数:" + Convert.ToString(server.ClientList.Count);
             //ExceptionManager.Publish(new Exception(msgex));
             DisconnEventArgs args = new DisconnEventArgs(client, server);
             this.raiseEvent(args);
             return;
         }
         for (int i = 0; i < 80; i++)
         {
             if (responseList.Count > 0)
                 break;
             Thread.Sleep(5);
         }
         if (responseList.Count < 1)
             continue;
         //同步事件触发发送响应数据
         clientinfo.OPdt = DateTime.Now;
         Monitor.Enter(clientinfo);
         byte[][] responseArray = responseList.ToArray();
         responseList.Clear();
         Monitor.PulseAll(clientinfo);
         Monitor.Exit(clientinfo);
         try
         {
             for (int i = 0; i < responseArray.Length; i++)
             {
                 client.Send(responseArray[i]);
                 Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " S发送:" + CommandBase.Parse(responseArray[i]));
                 myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " S发送:" + CommandBase.Parse(responseArray[i]));
                 ResponseSrvEventArgs argresp = new ResponseSrvEventArgs(client, server, responseArray[i]);
                 this.raiseEvent(argresp);
             }
         }
         catch (Exception ex)
         {
             server.Close(clientinfo);
             //NameValueCollection attr = new NameValueCollection();
             //attr["剩余连接数"] = Convert.ToString(server.ClientList.Count);
             //ExceptionManager.Publish(ex, attr);
             DisconnEventArgs args = new DisconnEventArgs(client, server, ex);
             this.raiseEvent(args);
             return;
         }
         clientinfo.OPdt = DateTime.Now;
     }
 }
예제 #16
0
        /// <summary>
        /// 服务器读取通讯数据
        /// </summary>
        /// <param name="client">客户端连接</param>
        /// <param name="server">服务器</param>
        private void readData(ClientInfo clientinfo, ServerBase server)
        {
            if (null == clientinfo || null == server)
                return;
            Socket client = clientinfo.Client;
            bool isopen = false;
            int iM = 1048576, available = 0;
            try
            {
                isopen = client.Connected;
                available = isopen ? client.Available : 0;
            }
            catch { return; }

            List<byte[]> responseList = clientinfo.BufferResponse;
            byte[] buffer = new byte[client.ReceiveBufferSize];
            MemoryStream stream = new MemoryStream();
            byte[] b = null;
            while (true)
            {
                while (available > 0)
                {
                    try
                    {
                        //执行请求
                        byte[] request = stream.ToArray();
                        long pos = stream.Position;
                        int len = client.Receive(buffer);
                        string msgrp = Encoding.GetEncoding("GB2312").GetString(buffer, 0, len);
                        Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " S接收:" + msgrp);
                        myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " S接收:" + msgrp);
                        clientinfo.OPdt = DateTime.Now;
                        if (request.Length > 0)
                        {
                            stream = new MemoryStream();
                            long lenr = request.LongLength;
                            for (int i = 0; i * iM < lenr; i++)
                                stream.Write(request, iM * i, lenr > (i + 1) * iM ? iM : (int)(lenr - i * iM));
                        }
                        stream.Seek(pos, SeekOrigin.Begin);
                        byte[] reqarg = new byte[len];
                        Array.Copy(buffer, reqarg, len);
                        RequestEventArgs argreq = new RequestEventArgs(client, server, reqarg);
                        this.raiseEvent(argreq);
                        b = server.Execute(clientinfo, buffer, len, ref stream);
                        available = client.Available;
                    }
                    catch (Exception ex)
                    {
                        byte[] request = stream.ToArray();
                        stream = new MemoryStream();
                        //NameValueCollection attr = new NameValueCollection();
                        //attr["剩余连接数"] = Convert.ToString(server.ClientList.Count);
                        //ExceptionManager.Publish(ex, attr);
                        ErrorRequestEventArgs argerr = new ErrorRequestEventArgs(client, server, request, ex);
                        this.raiseEvent(argerr);
                        if (ex is SocketException)
                        {
                            isopen = false;
                            break;
                        }
                        try { available = 0; isopen = client.Connected; available = isopen ? client.Available : 0; }
                        catch { isopen = false; }
                        continue;
                    }
                    //响应结果写入缓存,触发同步事件写入响应
                    if (null != b && b.Length > 0)
                    {
                        Monitor.Enter(clientinfo);
                        responseList.Add(b);
                        Monitor.PulseAll(clientinfo);
                        Monitor.Exit(clientinfo);
                    }
                }//while (available > 0)
                while(available < 1)
                {
                    Thread.Sleep(10);
                    try
                    {
                        isopen = client.Connected;
                        available = isopen ? client.Available : 0;
                        if (!isopen) break;
                    }
                    catch
                    {
                        available = 0; 
                        isopen = false; 
                        break;
                    }
                }
                if (!isopen)
                {
                    server.Close(clientinfo);
                    return;
                }
            }//while (true)
        }