源代码:
客户端:
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 { ?/// ?/// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的客户端 ?/// ?public class MyTcpIpClient : System.ComponentModel.Component ?{ ??private int bufferSize=2048; ??private string tcpIpServerIP="127.0.0.1"; ??private int tcpIpServerPort=11000; ??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); ????//Console.WriteLine(bytesSent); ???} ???catch (Exception e) ???{ ????OnErrorEvent(new ErrorEventArgs(e)); ???} ???finally ???{ ????sendDone.Set(); ???} ??} ??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??????{? ???????if(state.Cortrol==0 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<24)&0xff000000; ????????state.packSize=bi1; ????????ReadPiont++; ????????state.Cortrol=1; ???????} ?????? ???????if(state.Cortrol==1 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<16)&0x00ff0000; ????????state.packSize=state.packSize+bi1; ????????ReadPiont++; ????????state.Cortrol=2; ???????} ?????? ???????if(state.Cortrol==2 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<8)&0x0000ff00; ????????state.packSize=state.packSize+bi1; ????????ReadPiont++; ????????state.Cortrol=3; ???????} ??????? ???????if(state.Cortrol==3 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=bi1&0xff; ????????state.packSize=state.packSize+bi1-4; ????????ReadPiont++; ????????state.Cortrol=4; ???????} ??????? ???????if(state.Cortrol==4 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<24)&0xff000000; ????????state.residualSize=bi1; ????????ReadPiont++; ????????state.Cortrol=5; ????????state.packSize-=1; ???????} ??????? ???????if(state.Cortrol==5 && ReadPiont???????{ ????????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???????{ ????????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???????{ ????????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???????{ ????????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???????{ ????????int bi1=bytesRead-ReadPiont; ????????if(bi1????????{ ?????????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); ?????} ????} ???} ???catch (Exception e) ???{ ????OnErrorEvent(new ErrorEventArgs(e)); ???? ???} ??} ?? ??/// ??/// 连接服务器 ??/// ??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); ????connectDone.WaitOne(); ????StateObject state = new StateObject(bufferSize,ClientSocket); ????ClientSocket.BeginReceive(state.buffer,0,bufferSize,0, ?????new AsyncCallback(ReceiveCallback), state);? ???} ???catch(Exception e) ???{ ????OnErrorEvent(new ErrorEventArgs(e)); ???} ??? ??} ??/// ??/// 断开连接 ??/// ??public void Close() ??{ ???try ???{ ????ClientSocket.Shutdown(SocketShutdown.Both); ????ClientSocket.Close(); ???} ???catch(Exception e) ???{ ????OnErrorEvent(new ErrorEventArgs(e)); ???} ??? ??} ??/// ??/// 发送一个流数据 ??/// ??/// 数据流 ??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); ?????sendDone.WaitOne(); ?????byteData=new byte[bufferSize]; ?????n = Astream.Read(byteData,0,byteData.Length); ????} ???} ???catch (Exception e) ???{ ????OnErrorEvent(new ErrorEventArgs(e)); ???} ??} ?? ??/// ??/// 构造 ??/// ??/// 父控件 ??public MyTcpIpClient(System.ComponentModel.IContainer container) ??{ ???container.Add(this); ???InitializeComponent();
???// ???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 ???// ??} ??/// ??/// 构造 ??/// ??public MyTcpIpClient() ??{ ???InitializeComponent();
???// ???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 ???// ??}
??#region Component Designer generated code ??/// ??/// 设计器支持所需的方法 - 不要使用代码编辑器修改 ??/// 此方法的内容。 ??/// ??private void InitializeComponent() ??{
??} ??#endregion
??/// ??/// 要连接的服务器IP地址 ??/// ??public string TcpIpServerIP ??{ ???get ???{ ????return tcpIpServerIP; ???} ???set ???{ ????tcpIpServerIP=value; ???} ??}
??/// ??/// 要连接的服务器所使用的端口 ??/// ??public int TcpIpServerPort ??{ ???get ???{ ????return tcpIpServerPort; ???} ???set ???{ ????tcpIpServerPort=value; ???} ??}
??/// ??/// 缓冲器大小 ??/// ??public int BufferSize ??{ ???get ???{ ????return bufferSize; ???} ???set ???{ ????bufferSize=value; ???} ??} ?? ??/// ??/// 连接的活动状态 ??/// ??public bool Activ ??{ ???get ???{ ????if(ClientSocket==null) ????{ ?????return false; ????} ????return ClientSocket.Connected; ???} ??} ??/// ??/// 接收到数据引发的事件 ??/// ??public event InceptEvent Incept; ??/// ??/// 引发接收数据事件 ??/// ??/// 接收数据 ??protected virtual void OnInceptEvent(InceptEventArgs e) ??{ ???if (Incept != null) ???{ ????Incept(this, e); ???} ??} ??/// ??/// 发生错误引发的事件 ??/// ??public event ErrorEvent Error; ??/// ??/// 引发错误事件 ??/// ??/// 错误数据 ??protected virtual void OnErrorEvent(ErrorEventArgs e) ??{ ???if (Error != null) ???{ ????Error(this, e); ???} ??} ?? ?} ? ?/// ?/// 接收数据事件 ?/// ?public class InceptEventArgs : EventArgs ?{? ??private readonly Stream datastream; ??private readonly Socket clientSocket; ??/// ??/// 构造 ??/// ??/// 接收到的数据 ??/// 接收的插座 ??public InceptEventArgs(Stream Astream,Socket ClientSocket) ??{ ???datastream=Astream; ???clientSocket=ClientSocket; ??} ??/// ??/// 接受的数据流 ??/// ??public Stream Astream ??{???? ???get { return datastream;}????? ??} ??/// ??/// 接收的插座 ??/// ??public Socket ClientSocket ??{???? ???get { return clientSocket;}????? ??} ?}? ?/// ?/// 定义接收委托 ?/// ?public delegate void InceptEvent(object sender, InceptEventArgs e); ?/// ?/// 错处事件 ?/// ?public class ErrorEventArgs : EventArgs ?{? ??private readonly Exception error; ??/// ??/// 构造 ??/// ??/// 错误信息对象 ??public ErrorEventArgs(Exception Error) ??{ ???error=Error; ??} ??/// ??/// 错误信息对象 ??/// ??public Exception Error ??{???? ???get { return error;}????? ??} ?} ?/// ?/// 错误委托 ?/// ?public delegate void ErrorEvent(object sender, ErrorEventArgs e); ? ? ? }
服务器端:
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 { ?/// ?/// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端 ?/// ?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??????{? ???????if(state.Cortrol==0 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<24)&0xff000000; ????????state.packSize=bi1; ????????ReadPiont++; ????????state.Cortrol=1; ???????} ?????? ???????if(state.Cortrol==1 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<16)&0x00ff0000; ????????state.packSize=state.packSize+bi1; ????????ReadPiont++; ????????state.Cortrol=2; ???????} ?????? ???????if(state.Cortrol==2 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<8)&0x0000ff00; ????????state.packSize=state.packSize+bi1; ????????ReadPiont++; ????????state.Cortrol=3; ???????} ??????? ???????if(state.Cortrol==3 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=bi1&0xff; ????????state.packSize=state.packSize+bi1-4; ????????ReadPiont++; ????????state.Cortrol=4; ???????} ??????? ???????if(state.Cortrol==4 && ReadPiont???????{ ????????long bi1=state.buffer[ReadPiont]; ????????bi1=(bi1<<24)&0xff000000; ????????state.residualSize=bi1; ????????ReadPiont++; ????????state.Cortrol=5; ????????state.packSize-=1; ???????} ??????? ???????if(state.Cortrol==5 && ReadPiont???????{ ????????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???????{ ????????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???????{ ????????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???????{ ????????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???????{ ????????int bi1=bytesRead-ReadPiont; ????????if(bi1????????{ ?????????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(); ???} ??} ?? ??/// ??/// 析构 ??/// ??/// 不知道 ??protected override void Dispose(bool disposing) ??{ ???Abort(); ??} ?? ??/// ??/// 引发接收事件 ??/// ??/// 数据 ??protected virtual void OnInceptServerEvent(InceptServerEventArgs e) ??{ ???if (InceptServer != null) ???{ ????InceptServer(this, e); ???} ??} ??/// ??/// 引发错误事件 ??/// ??/// 数据 ??protected virtual void OnErrorServerEvent(ErrorServerEventArgs e) ??{ ???if (ErrorServer != null) ???{ ????ErrorServer(this, e); ???} ??} ?? ??/// ??/// 开始监听访问 ??/// ??public void Listening() ??{ ???//StartListening(); ???thread=new Thread(new ThreadStart(StartListening)); ???thread.Name="MyTcpIpServer.Listening"; ???thread.Start(); ??} ??/// ??/// 异常中止服务 ??/// ??public void Abort() ??{ ???if(thread!=null) ???{ ????thread.Abort(); ????listener.Close(); ???} ??} ?? ??/// ??///构造 ??/// ??/// 父控件 ??public MyTcpIpServer(System.ComponentModel.IContainer container) ??{ ???container.Add(this); ???InitializeComponent();
???// ???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 ???// ??}
??/// ??/// 构造 ??/// ??public MyTcpIpServer() ??{ ???InitializeComponent();
???// ???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 ???// ??}
??#region Component Designer generated code ??/// ??/// 设计器支持所需的方法 - 不要使用代码编辑器修改 ??/// 此方法的内容。 ??/// ??private void InitializeComponent() ??{
??} ??#endregion
??/// ??/// 要连接的服务器IP地址 ??/// ??public string TcpIpServerIP ??{ ???get ???{ ????return tcpIpServerIP; ???} ???set ???{ ????tcpIpServerIP=value; ???} ??}
??/// ??/// 要连接的服务器所使用的端口 ??/// ??public int TcpIpServerPort ??{ ???get ???{ ????return tcpIpServerPort; ???} ???set ???{ ????tcpIpServerPort=value; ???} ??}
??/// ??/// 缓冲器大小 ??/// ??public int BufferSize ??{ ???get ???{ ????return bufferSize; ???} ???set ???{ ????bufferSize=value; ???} ??} ?? ??/// ??/// 连接的活动状态 ??/// ??public bool Activ ??{ ???get ???{ ????return listener.Connected; ???} ???//set ???//{ ???//?activ=value; ???//} ??}
??/// ??/// 发送一个流数据 ??/// ??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)); ???} ??} ?? ??/// ??/// 接收到数据事件 ??/// ??public event InceptServerEvent InceptServer; ??/// ??/// 发生错误事件 ??/// ??public event ErrorServerEvent ErrorServer; ?} ?/// ?/// 状态对象 ?/// ?public class StateObject ?{ ??/// ??/// 构造 ??/// ??/// 缓存 ??/// 工作的插座 ??public StateObject(int bufferSize,Socket WorkSocket) ??{ ???buffer = new byte[bufferSize]; ???workSocket=WorkSocket; ??} ??/// ??/// 缓存 ??/// ??public byte[] buffer = null; ??/// ??/// 工作插座 ??/// ??public Socket workSocket = null;????????????? ??/// ??/// 数据流 ??/// ??public Stream Datastream=new MemoryStream(); ??/// ??/// 剩余大小 ??/// ??public long residualSize=0; ??/// ??/// 数据包大小 ??/// ??public long packSize=0; ??/// ??/// 计数器 ??/// ??public int Cortrol=0; ?} ? ?/// ?/// 接收事件 ?/// ?public class InceptServerEventArgs : EventArgs ?{? ??private readonly Stream datastream; ??private readonly Socket serverSocket; ??private readonly MyTcpIpServer tcpIpServer; ??/// ??/// 构造 ??/// ??/// 数据 ??/// 工作插座 ??/// 提供服务的TCP/IP对象 ??public InceptServerEventArgs(Stream Astream,Socket ServerSocket,MyTcpIpServer TcpIpServer) ??{ ???datastream=Astream; ???serverSocket=ServerSocket; ???tcpIpServer=TcpIpServer; ??} ??? /// ??? /// 数据 ??? /// ??public Stream Astream ??{???? ???get { return datastream;}????? ??} ??/// ??/// 工作插座 ??/// ??public Socket ServerSocket ??{???? ???get { return serverSocket;}????? ??} ??/// ??/// 提供TCP/IP服务的服务器对象. ??/// ??public MyTcpIpServer TcpIpServer ??{???? ???get { return tcpIpServer;}????? ??} ?} ?/// ?/// 接收数据委托 ?/// ? public delegate void InceptServerEvent(object sender, InceptServerEventArgs e); ?/// ?/// 错误事件委托 ?/// ?public class ErrorServerEventArgs : EventArgs ?{? ??private readonly Exception error; ??private readonly Socket serverSocket; ??/// ??/// 构造 ??/// ??/// 数据 ??/// 问题插座 ??public ErrorServerEventArgs(Exception Error,Socket ServerSocket) ??{ ???error=Error; ???serverSocket=ServerSocket; ??} ??? /// ??? /// 数据 ??? /// ??public Exception Error ??{???? ???get { return error;}????? ??} ??/// ??/// 问题插座 ??/// ??public Socket ServerSocket ??{???? ???get { return serverSocket;}????? ??} ?} ?/// ?///错误事件委托 ?/// ? public delegate void ErrorServerEvent(object sender, ErrorServerEventArgs e); }
完成端口方式是NT目前最好的一种通信方式,它在大吞吐,大数量连接下,比其它方式有无法比拟的效率以及性能,因C#在的Socket在内部使用的完成端口方式,在程序实现上异常简单,请大家体会.
?
? 
|