Unity3d +vs2015 多线程.多并发网络解决方案(C#)

来源:互联网 发布:淘宝助理 彩色发货单 编辑:程序博客网 时间:2024/05/16 16:58

很久以前写的了.也随便分享给大家把
此方案和结构在多线程多并发大吞吐下有绝对的效率优势
以下是服务端 vs2015 C#

using System;using System.IO;using System.ComponentModel;using System.Collections;using System.Collections.Generic;using System.Diagnostics;using System.Net;using System.Net.Sockets;using System.Threading;using Tools;using GameDates;namespace TestServer{    /// <summary>    /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端     /// </summary>    public class MyTcpIpServer : System.ComponentModel.Component    {        private int bufferSize=2048;        private string tcpIpServerIP="127.0.0.1";        private int tcpIpServerPort=11000;        private Socket listener=null;        private ManualResetEvent allDone = new ManualResetEvent(false);        private ManualResetEvent sendDone = new ManualResetEvent(false);        private Thread thread=null;        public static List<StateObject> StateList = new List<StateObject>();        private void StartListening()         {            try            {                listener = new Socket(AddressFamily.InterNetwork,                    SocketType.Stream, ProtocolType.Tcp);                IPAddress ipAddress;                if(tcpIpServerIP.Trim()=="")                {                    ipAddress=IPAddress.Any;                    }                else                {                    ipAddress=IPAddress.Parse(tcpIpServerIP);                }                IPEndPoint localEndPoint = new IPEndPoint(ipAddress, tcpIpServerPort);                listener.Bind(localEndPoint);                listener.Listen(10);                while (true)                 {                    allDone.Reset();                    listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);                    allDone.WaitOne();                }            }             catch (Exception e)             {                OnErrorServerEvent(new ErrorServerEventArgs(e,listener));                }        }        private void ReadCallback(IAsyncResult ar)         {            Socket handler=null;            try            {                lock(ar)                {                    StateObject state = (StateObject) ar.AsyncState;                    handler = state.workSocket;                    int bytesRead = handler.EndReceive(ar);                    if (bytesRead > 0)                     {                        int ReadPiont=0;                            while(ReadPiont<bytesRead)                        {                                if(state.Cortrol==0 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=(bi1<<24)&0xff000000;                                state.packSize=bi1;                                ReadPiont++;                                state.Cortrol=1;                            }                            if(state.Cortrol==1 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=(bi1<<16)&0x00ff0000;                                state.packSize=state.packSize+bi1;                                ReadPiont++;                                state.Cortrol=2;                            }                            if(state.Cortrol==2 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=(bi1<<8)&0x0000ff00;                                state.packSize=state.packSize+bi1;                                ReadPiont++;                                state.Cortrol=3;                            }                            if(state.Cortrol==3 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=bi1&0xff;                                state.packSize=state.packSize+bi1-4;                                ReadPiont++;                                state.Cortrol=4;                            }                            if(state.Cortrol==4 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=(bi1<<24)&0xff000000;                                state.residualSize=bi1;                                ReadPiont++;                                state.Cortrol=5;                                state.packSize-=1;                            }                            if(state.Cortrol==5 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=(bi1<<16)&0x00ff0000;                                state.residualSize=state.residualSize+bi1;                                ReadPiont++;                                state.Cortrol=6;                                state.packSize-=1;                            }                            if(state.Cortrol==6 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=(bi1<<8)&0x0000ff00;                                state.residualSize=state.residualSize+bi1;                                ReadPiont++;                                state.Cortrol=7;                                state.packSize-=1;                            }                            if(state.Cortrol==7 && ReadPiont<bytesRead)                            {                                long bi1=state.buffer[ReadPiont];                                bi1=bi1&0xff;                                state.residualSize=state.residualSize+bi1;                                state.Datastream.SetLength(0);                                state.Datastream.Position=0;                                ReadPiont++;                                state.Cortrol=8;                                state.packSize-=1;                            }                            if(state.Cortrol==8 && ReadPiont<bytesRead)                            {                                int bi1=bytesRead-ReadPiont;                                int bi2=(int)(state.residualSize-state.Datastream.Length);                                if(bi1>=bi2)                                {                                    state.Datastream.Write(state.buffer,ReadPiont,bi2);                                    ReadPiont+=bi2;                                    OnInceptServerEvent(new InceptServerEventArgs(state.Datastream,state.workSocket,this));                                    state.Cortrol=9;                                    state.packSize-=bi2;                                }                                else                                {                                    state.Datastream.Write(state.buffer,ReadPiont,bi1);                                    ReadPiont+=bi1;                                    state.packSize-=bi1;                                }                            }                            if(state.Cortrol==9 && ReadPiont<bytesRead)                            {                                int bi1=bytesRead-ReadPiont;                                if(bi1<state.packSize)                                {                                    state.packSize=state.packSize-bi1;                                    ReadPiont+=bi1;                                }                                    else                                {                                    state.Cortrol=0;                                    ReadPiont+=(int)state.packSize;                                }                            }                        }                        if(handler.Connected==true)                        {                            //异步读取数据流                            handler.BeginReceive(state.buffer,0,bufferSize,0,new AsyncCallback(ReadCallback), state);                            Console.WriteLine("接收字节长度【{0}】", state.buffer.Length);                            //获取有效数据长度                            long size = state.residualSize;                            //解析数据....                        }                    }                    else                    {                        handler.Shutdown(SocketShutdown.Both);                        handler.Close();                        //throw(new Exception("读入的数据小于1bit"));                    }                }            }            catch (Exception e)             {                OnErrorServerEvent(new ErrorServerEventArgs(e,handler));            }        }        private void SendCallback(IAsyncResult ar)         {            Socket client = (Socket) ar.AsyncState;            try            {                int bytesSent = client.EndSend(ar);            }             catch (Exception e)             {                OnErrorServerEvent(new ErrorServerEventArgs(e,client));            }            finally            {                sendDone.Set();            }        }        private void AcceptCallback(IAsyncResult ar)         {            Socket handler=null;            try            {                Socket listener = (Socket) ar.AsyncState;                handler= listener.EndAccept(ar);                StateObject state = new StateObject(bufferSize,handler);                state.workSocket = handler;                IPEndPoint msg = (IPEndPoint)state.workSocket.RemoteEndPoint;                state.ip = msg.Address.ToString();                state.prot = msg.Port;                StateList.Add(state);                Console.WriteLine("连接数[{0}],{1}", StateList.Count, state.workSocket.RemoteEndPoint);                handler.BeginReceive(state.buffer,0,bufferSize,0,new AsyncCallback(ReadCallback), state);            }            catch (Exception e)             {                OnErrorServerEvent(new ErrorServerEventArgs(e,handler));            }            finally            {                allDone.Set();            }        }        /// <summary>        /// 析构        /// </summary>        /// <param name="disposing">不知道</param>        protected override void Dispose(bool disposing)        {            Abort();        }        /// <summary>        /// 引发接收事件        /// </summary>        /// <param name="e">数据</param>        protected virtual void OnInceptServerEvent(InceptServerEventArgs e)        {            if (InceptServer != null)             {                InceptServer(this, e);            }        }        /// <summary>        /// 引发错误事件        /// </summary>        /// <param name="e">数据</param>        protected virtual void OnErrorServerEvent(ErrorServerEventArgs e)        {            if (ErrorServer != null)             {                ErrorServer(this, e);             }        }        /// <summary>        /// 开始监听访问        /// </summary>        public void Listening()        {            //StartListening();            thread=new Thread(new ThreadStart(StartListening));            thread.Name="MyTcpIpServer.Listening";            thread.Start();        }        /// <summary>        /// 异常中止服务        /// </summary>        public void Abort()        {            if(thread!=null)            {                thread.Abort();                listener.Close();            }        }        /// <summary>        ///构造         /// </summary>        /// <param name="container">父控件</param>        public MyTcpIpServer(System.ComponentModel.IContainer container)        {            container.Add(this);            //InitializeComponent();            //            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码            //        }        /// <summary>        /// 构造        /// </summary>        public MyTcpIpServer()        {            StartListening();        }        /// <summary>        /// 要连接的服务器IP地址        /// </summary>        public string TcpIpServerIP        {            get            {                return tcpIpServerIP;            }            set            {                tcpIpServerIP=value;            }        }        /// <summary>        /// 要连接的服务器所使用的端口        /// </summary>        public int TcpIpServerPort        {            get            {                return tcpIpServerPort;            }            set            {                tcpIpServerPort=value;            }        }        /// <summary>        /// 缓冲器大小        /// </summary>        public int BufferSize        {            get            {                return bufferSize;            }            set            {                bufferSize=value;            }        }        /// <summary>        /// 连接的活动状态        /// </summary>        public bool Activ        {            get            {                return listener.Connected;            }            //set            //{            //    activ=value;            //}        }        /// <summary>        /// 发送一个流数据        /// </summary>        public void Send(Socket ClientSocket,Stream Astream)        {            try            {                if(ClientSocket.Connected==false)                {                    throw(new Exception("没有连接客户端不可以发送信息!"));                }                Astream.Position=0;                byte[] byteData=new byte[bufferSize];                int bi1=(int)((Astream.Length+8)/bufferSize);                int bi2=(int)Astream.Length;                if(((Astream.Length+8)%bufferSize)>0)                {                    bi1=bi1+1;                }                bi1=bi1*bufferSize;                byteData[0]=System.Convert.ToByte(bi1>>24);                byteData[1]=System.Convert.ToByte((bi1&0x00ff0000)>>16);                byteData[2]=System.Convert.ToByte((bi1&0x0000ff00)>>8);                byteData[3]=System.Convert.ToByte((bi1&0x000000ff));                byteData[4]=System.Convert.ToByte(bi2>>24);                byteData[5]=System.Convert.ToByte((bi2&0x00ff0000)>>16);                byteData[6]=System.Convert.ToByte((bi2&0x0000ff00)>>8);                byteData[7]=System.Convert.ToByte((bi2&0x000000ff));                int n = Astream.Read(byteData, 8, byteData.Length-8);                while (n>0)                 {                    ClientSocket.BeginSend(byteData, 0, byteData.Length, 0,    new AsyncCallback(SendCallback), ClientSocket);                    sendDone.WaitOne();                    byteData=new byte[bufferSize];                    n = Astream.Read(byteData,0,byteData.Length);                }            }             catch (Exception e)             {                OnErrorServerEvent(new ErrorServerEventArgs(e,ClientSocket));            }        }        /// <summary>        /// 接收到数据事件        /// </summary>        public event InceptServerEvent InceptServer;        /// <summary>        /// 发生错误事件        /// </summary>        public event ErrorServerEvent ErrorServer;    }    /// <summary>    /// 状态对象    /// </summary>    public class StateObject     {        /// <summary>        /// 构造        /// </summary>        /// <param name="bufferSize">缓存</param>        /// <param name="WorkSocket">工作的插座</param>        public StateObject(int bufferSize,Socket WorkSocket)        {            buffer = new byte[bufferSize];            workSocket=WorkSocket;        }        /// <summary>        /// 缓存        /// </summary>        public byte[] buffer = null;        /// <summary>        /// 工作插座        /// </summary>        public Socket workSocket = null;                      /// <summary>        /// 数据流        /// </summary>        public Stream Datastream=new MemoryStream();        /// <summary>        /// 剩余大小        /// </summary>        public long residualSize=0;        /// <summary>        /// 数据包大小        /// </summary>        public long packSize=0;        /// <summary>        /// 计数器        /// </summary>        public int Cortrol=0;        /// <summary>        /// 客户端端口        /// </summary>        public int prot;        /// <summary>        /// 客户端ip地址        /// </summary>        public string ip;    }    /// <summary>    /// 接收事件    /// </summary>    public class InceptServerEventArgs : EventArgs     {          private readonly Stream datastream;        private readonly Socket serverSocket;        private readonly MyTcpIpServer tcpIpServer;        /// <summary>        /// 构造        /// </summary>        /// <param name="Astream">数据</param>        /// <param name="ServerSocket">工作插座</param>        /// <param name="TcpIpServer">提供服务的TCP/IP对象</param>        public InceptServerEventArgs(Stream Astream,Socket ServerSocket,MyTcpIpServer TcpIpServer)         {            datastream=Astream;            serverSocket=ServerSocket;            tcpIpServer=TcpIpServer;        }    /// <summary>    /// 数据    /// </summary>        public Stream Astream        {                 get { return datastream;}              }        /// <summary>        /// 工作插座        /// </summary>        public Socket ServerSocket        {                 get { return serverSocket;}              }        /// <summary>        /// 提供TCP/IP服务的服务器对象.        /// </summary>        public MyTcpIpServer TcpIpServer        {                 get { return tcpIpServer;}              }    }    /// <summary>    /// 接收数据委托    /// </summary>  public delegate void InceptServerEvent(object sender, InceptServerEventArgs e);    /// <summary>    /// 错误事件委托    /// </summary>    public class ErrorServerEventArgs : EventArgs     {          private readonly Exception error;        private readonly Socket serverSocket;        /// <summary>        /// 构造        /// </summary>        /// <param name="Error">数据</param>        /// <param name="ServerSocket">问题插座</param>        public ErrorServerEventArgs(Exception Error,Socket ServerSocket)         {            error=Error;            serverSocket=ServerSocket;        }    /// <summary>    /// 数据    /// </summary>        public Exception Error        {                 get { return error;}              }        /// <summary>        /// 问题插座        /// </summary>        public Socket ServerSocket        {                 get { return serverSocket;}              }    }    /// <summary>    ///错误事件委托     /// </summary>  public delegate void ErrorServerEvent(object sender, ErrorServerEventArgs e);}

客户端部分 当时用的是这个Unity3d 4.1.0 C#
还没移植U5里面过.不过应该没什么问题的.有问题欢迎提出

using UnityEngine;using clinet;public class Index : MonoBehaviour {    void Awake()     {        new MyTcpIpClient();     } }///GameClient.csusing System;using System.IO;using System.ComponentModel;using System.Collections;using System.Diagnostics;using System.Net;using System.Net.Sockets;using System.Threading;using Tools;using GameDates;namespace clinet{    /// <summary>    /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的客户端     /// </summary>    public class MyTcpIpClient : System.ComponentModel.Component    {        private int bufferSize = 2048;        private string tcpIpServerIP = "192.168.1.204";        private int tcpIpServerPort = 9000;        private Socket ClientSocket = null;        private ManualResetEvent connectDone = new ManualResetEvent(false);        private ManualResetEvent sendDone = new ManualResetEvent(false);        private void ConnectCallback(IAsyncResult ar)        {            try            {                Socket client = (Socket)ar.AsyncState;                client.EndConnect(ar);            }            catch (Exception e)            {                OnErrorEvent(new ErrorEventArgs(e));            }            finally            {                connectDone.Set();            }        }        private void SendCallback(IAsyncResult ar)        {            try            {                Socket client = (Socket)ar.AsyncState;                int bytesSent = client.EndSend(ar);            }            catch (Exception e)            {                OnErrorEvent(new ErrorEventArgs(e));            }            finally            {                sendDone.Set();            }        }        /// <summary>        /// 数据接收处理        /// </summary>        /// <param name="ar"></param>        private void ReceiveCallback(IAsyncResult ar)        {            Socket handler = null;            try            {                lock (ar)                {                    StateObject state = (StateObject)ar.AsyncState;                    handler = state.workSocket;                    int bytesRead = handler.EndReceive(ar);                    if (bytesRead > 0)                    {                        int ReadPiont = 0;                        while (ReadPiont < bytesRead)                        {                            if (state.Cortrol == 0 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = (bi1 << 24) & 0xff000000;                                state.packSize = bi1;                                ReadPiont++;                                state.Cortrol = 1;                            }                            if (state.Cortrol == 1 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = (bi1 << 16) & 0x00ff0000;                                state.packSize = state.packSize + bi1;                                ReadPiont++;                                state.Cortrol = 2;                            }                            if (state.Cortrol == 2 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = (bi1 << 8) & 0x0000ff00;                                state.packSize = state.packSize + bi1;                                ReadPiont++;                                state.Cortrol = 3;                            }                            if (state.Cortrol == 3 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = bi1 & 0xff;                                state.packSize = state.packSize + bi1 - 4;                                ReadPiont++;                                state.Cortrol = 4;                            }                            if (state.Cortrol == 4 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = (bi1 << 24) & 0xff000000;                                state.residualSize = bi1;                                ReadPiont++;                                state.Cortrol = 5;                                state.packSize -= 1;                            }                            if (state.Cortrol == 5 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = (bi1 << 16) & 0x00ff0000;                                state.residualSize = state.residualSize + bi1;                                ReadPiont++;                                state.Cortrol = 6;                                state.packSize -= 1;                            }                            if (state.Cortrol == 6 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = (bi1 << 8) & 0x0000ff00;                                state.residualSize = state.residualSize + bi1;                                ReadPiont++;                                state.Cortrol = 7;                                state.packSize -= 1;                            }                            if (state.Cortrol == 7 && ReadPiont < bytesRead)                            {                                long bi1 = state.buffer[ReadPiont];                                bi1 = bi1 & 0xff;                                state.residualSize = state.residualSize + bi1;                                state.Datastream.SetLength(0);                                state.Datastream.Position = 0;                                ReadPiont++;                                state.Cortrol = 8;                                state.packSize -= 1;                            }                            if (state.Cortrol == 8 && ReadPiont < bytesRead)                            {                                int bi1 = bytesRead - ReadPiont;                                int bi2 = (int)(state.residualSize - state.Datastream.Length);                                if (bi1 >= bi2)                                {                                    state.Datastream.Write(state.buffer, ReadPiont, bi2);                                    ReadPiont += bi2;                                    OnInceptEvent(new InceptEventArgs(state.Datastream, handler));                                    state.Cortrol = 9;                                    state.packSize -= bi2;                                }                                else                                {                                    state.Datastream.Write(state.buffer, ReadPiont, bi1);                                    ReadPiont += bi1;                                    state.packSize -= bi1;                                }                            }                            if (state.Cortrol == 9 && ReadPiont < bytesRead)                            {                                int bi1 = bytesRead - ReadPiont;                                if (bi1 < state.packSize)                                {                                    state.packSize = state.packSize - bi1;                                    ReadPiont += bi1;                                }                                else                                {                                    state.Cortrol = 0;                                    ReadPiont += (int)state.packSize;                                }                            }                        }                    }                    else                    {                        throw (new Exception("读入的数据小于1bit"));                    }                    if (handler.Connected == true)                    {                        handler.BeginReceive(state.buffer, 0, bufferSize, 0, new AsyncCallback(ReceiveCallback), state);                        Console.WriteLine("接收字节长度【{0}】", state.buffer.Length);                        long size = state.residualSize;                    }                }            }            catch (Exception e)            {                OnErrorEvent(new ErrorEventArgs(e));            }        }        /// <summary>        /// 连接服务器        /// </summary>        public void Conn()        {            try            {                ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP);                IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort);                connectDone.Reset();                ClientSocket.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), ClientSocket);            }            catch (Exception e)            {                OnErrorEvent(new ErrorEventArgs(e));            }        }        /// <summary>        /// 断开连接        /// </summary>        public void Close()        {            try            {                if (ClientSocket.Connected == true)                {                    ClientSocket.Shutdown(SocketShutdown.Both);                    ClientSocket.Close();                }            }            catch (Exception e)            {                OnErrorEvent(new ErrorEventArgs(e));            }        }        /// <summary>        /// 发送一个流数据        /// </summary>        /// <param name="Astream">数据流</param>        public void Send(Stream Astream)        {            try            {                if (ClientSocket.Connected == false)                {                    throw (new Exception("没有连接服务器不可以发送信息!"));                }                Astream.Position = 0;                byte[] byteData = new byte[bufferSize];                int bi1 = (int)((Astream.Length + 8) / bufferSize);                int bi2 = (int)Astream.Length;                if (((Astream.Length + 8) % bufferSize) > 0)                {                    bi1 = bi1 + 1;                }                bi1 = bi1 * bufferSize;                byteData[0] = System.Convert.ToByte(bi1 >> 24);                byteData[1] = System.Convert.ToByte((bi1 & 0x00ff0000) >> 16);                byteData[2] = System.Convert.ToByte((bi1 & 0x0000ff00) >> 8);                byteData[3] = System.Convert.ToByte((bi1 & 0x000000ff));                byteData[4] = System.Convert.ToByte(bi2 >> 24);                byteData[5] = System.Convert.ToByte((bi2 & 0x00ff0000) >> 16);                byteData[6] = System.Convert.ToByte((bi2 & 0x0000ff00) >> 8);                byteData[7] = System.Convert.ToByte((bi2 & 0x000000ff));                int n = Astream.Read(byteData, 8, byteData.Length - 8);                while (n > 0)                {                    ClientSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), ClientSocket);                    Console.WriteLine("发送字节长度【{0}】", byteData.Length);                    sendDone.WaitOne();                    byteData = new byte[bufferSize];                    n = Astream.Read(byteData, 0, byteData.Length);                }            }            catch (Exception e)            {                OnErrorEvent(new ErrorEventArgs(e));            }        }        /// <summary>        /// 构造        /// </summary>        /// <param name="container">父控件</param>        public MyTcpIpClient(System.ComponentModel.IContainer container)        {            container.Add(this);            //InitializeComponent();            //            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码            //        }        /// <summary>        /// 构造        /// </summary>        public MyTcpIpClient()        {            Conn();            //连接完成后开始循环接收服务端返回数据            while (true)            {                connectDone.WaitOne();                StateObject Cstate = new StateObject(bufferSize, ClientSocket);                ClientSocket.BeginReceive(Cstate.buffer, 0, bufferSize, 0,                    new AsyncCallback(ReceiveCallback), Cstate);                Thread.Sleep(100);            }        }        //#region Component Designer generated code        ///// <summary>        ///// 设计器支持所需的方法 - 不要使用代码编辑器修改        ///// 此方法的内容。        ///// </summary>        //private void InitializeComponent()        //{        //    Conn();        //}        //#endregion        /// <summary>        /// 要连接的服务器IP地址        /// </summary>        public string TcpIpServerIP        {            get            {                return tcpIpServerIP;            }            set            {                tcpIpServerIP = value;            }        }        /// <summary>        /// 要连接的服务器所使用的端口        /// </summary>        public int TcpIpServerPort        {            get            {                return tcpIpServerPort;            }            set            {                tcpIpServerPort = value;            }        }        /// <summary>        /// 缓冲器大小        /// </summary>        public int BufferSize        {            get            {                return bufferSize;            }            set            {                bufferSize = value;            }        }        /// <summary>        /// 连接的活动状态        /// </summary>        public bool Activ        {            get            {                if (ClientSocket == null)                {                    return false;                }                return ClientSocket.Connected;            }        }        /// <summary>        /// 接收到数据引发的事件        /// </summary>        public event InceptEvent Incept;        /// <summary>        /// 引发接收数据事件        /// </summary>        /// <param name="e">接收数据</param>        protected virtual void OnInceptEvent(InceptEventArgs e)        {            if (Incept != null)            {                Incept(this, e);            }        }        /// <summary>        /// 发生错误引发的事件        /// </summary>        public event ErrorEvent Error;        /// <summary>        /// 引发错误事件        /// </summary>        /// <param name="e">错误数据</param>        protected virtual void OnErrorEvent(ErrorEventArgs e)        {            if (Error != null)            {                Error(this, e);            }        }    }    /// <summary>    /// 状态对象    /// </summary>    public class StateObject    {        /// <summary>        /// 构造        /// </summary>        /// <param name="bufferSize">缓存</param>        /// <param name="WorkSocket">工作的插座</param>        public StateObject(int bufferSize, Socket WorkSocket)        {            buffer = new byte[bufferSize];            workSocket = WorkSocket;        }        /// <summary>        /// 缓存        /// </summary>        public byte[] buffer = null;        /// <summary>        /// 工作插座        /// </summary>        public Socket workSocket = null;        /// <summary>        /// 数据流        /// </summary>        public Stream Datastream = new MemoryStream();        /// <summary>        /// 剩余大小        /// </summary>        public long residualSize = 0;        /// <summary>        /// 数据包大小        /// </summary>        public long packSize = 0;        /// <summary>        /// 计数器        /// </summary>        public int Cortrol = 0;    }    /// <summary>    /// 接收数据事件    /// </summary>    public class InceptEventArgs : EventArgs    {        private readonly Stream datastream;        private readonly Socket clientSocket;        /// <summary>        /// 构造        /// </summary>        /// <param name="Astream">接收到的数据</param>        /// <param name="ClientSocket">接收的插座</param>        public InceptEventArgs(Stream Astream, Socket ClientSocket)        {            datastream = Astream;            clientSocket = ClientSocket;        }        /// <summary>        /// 接受的数据流        /// </summary>        public Stream Astream        {            get { return datastream; }        }        /// <summary>        /// 接收的插座        /// </summary>        public Socket ClientSocket        {            get { return clientSocket; }        }    }    /// <summary>    /// 定义接收委托    /// </summary>    public delegate void InceptEvent(object sender, InceptEventArgs e);    /// <summary>    /// 错处事件    /// </summary>    public class ErrorEventArgs : EventArgs    {        private readonly Exception error;        /// <summary>        /// 构造        /// </summary>        /// <param name="Error">错误信息对象</param>        public ErrorEventArgs(Exception Error)        {            error = Error;        }        /// <summary>        /// 错误信息对象        /// </summary>        public Exception Error        {            get { return error; }        }    }    /// <summary>    /// 错误委托    /// </summary>    public delegate void ErrorEvent(object sender, ErrorEventArgs e);}
0 0
原创粉丝点击