正文

c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码) 服务器端2007-06-11 11:42:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/Csharpsky/26657.html

分享到:

using System;using System.IO;using System.ComponentModel;using System.Collections;using System.Diagnostics;using System.Net;using System.Net.Sockets;using System.Threading; namespace MyKJ...{    /**//// <summary>    /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端     /// </summary>    public class MyTcpIpServer : System.ComponentModel.Component    ...{        private int bufferSize=2048;        private string tcpIpServerIP="";        private int tcpIpServerPort=11000;        private Socket listener=null;        private ManualResetEvent allDone = new ManualResetEvent(false);        private ManualResetEvent sendDone = new ManualResetEvent(false);        private Thread thread=null;                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);                        }                    }                    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;                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()        ...{            InitializeComponent();             //            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码            //        }         Component Designer generated code#region Component Designer generated code        /**//// <summary>        /// 设计器支持所需的方法 - 不要使用代码编辑器修改        /// 此方法的内容。        /// </summary>        private void InitializeComponent()        ...{         }        #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            ...{                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 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);}

阅读(10351) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册