c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码)

源代码:

客户端:

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  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 < 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);
                    }
                }
            }
            
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);
                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));
            }
            
        }
        
/**/ ///   <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);
                    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()
        {
            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
            {
                
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  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);
    
    
    
}


服务器端:

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);
}

你可能感兴趣的:(TCP/IP)