事件和委托在通信编程中的应用

封装后的socket类

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Net.Sockets;
  5 using System.Net;
  6 
  7 namespace SICOMSocket
  8 {
  9     public class SocketAsyncServer
 10     {
 11 
 12         public delegate void ProcessMessageeDelegate(Socket clientSock, byte[] msgBuff, DateTime getDataTime);
 13         public event ProcessMessageeDelegate ProcessMessageeEnvent;
 14 
 15         public delegate void ClearFlag();
 16         public event ClearFlag Clear;
 17 
 18         public delegate void NewConnectDelegate(string IP, string port, Socket clinetSocket);
 19         public event NewConnectDelegate NewConnectEnvent;
 20 
 21         public delegate void ClientShutDownDelegate(string IP, string port);
 22         public event ClientShutDownDelegate ClientShutDownEnvent;
 23 
 24 
 25         private Socket serverSock;
 26         byte[] msgBuff = new byte[1024];
 27 
 28         public void Start(int port)
 29         {
 30             try
 31             {
 32                 serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 33                 serverSock.Bind(new IPEndPoint(IPAddress.Any, port));
 34                 serverSock.Listen(10);
 35                 Console.WriteLine("开始监听端口" + port + "......");
 36                 serverSock.BeginAccept(new AsyncCallback(OnConnectRequest), serverSock);
 37             }
 38             catch (Exception ex)
 39             {
 40                 Console.WriteLine("监听端口" + port + "失败,请检查该端口是否被占用! " + ex.Message);
 41             }
 42         }
 43 
 44         public void OnConnectRequest(IAsyncResult ar)
 45         {
 46             try
 47             {
 48                 Socket listenerSock = (Socket)ar.AsyncState;
 49                 NewConnection(listenerSock.EndAccept(ar));
 50                 listenerSock.BeginAccept(new AsyncCallback(OnConnectRequest), listenerSock);
 51                 Console.WriteLine("已接受远程连接!");
 52             }
 53             catch (Exception ex)
 54             {
 55                 Console.WriteLine("新链接创建错误:" + ex.Message);
 56             }
 57         }
 58 
 59         private void NewConnection(Socket clientSock)
 60         {
 61             try
 62             {
 63                 EndPoint tempRemoteEP = clientSock.RemoteEndPoint;
 64                 IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
 65                 string rempip = tempRemoteIP.Address.ToString();
 66                 string remoport = tempRemoteIP.Port.ToString();
 67                 NewConnectEnvent(rempip, remoport, clientSock);
 68                 Clear();
 69                 AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
 70                 clientSock.BeginReceive(msgBuff, 0, msgBuff.Length, SocketFlags.None, recieveData, clientSock);
 71             }
 72             catch (Exception ex)
 73             {
 74                 Console.WriteLine("接收回调函数设置失败 {0}", ex.Message);
 75             }
 76         }
 77 
 78         public void OnRecievedData(IAsyncResult ar)
 79         {
 80             Socket sock = (Socket)ar.AsyncState;
 81             try
 82             {
 83                 DateTime getDataTime = DateTime.Now;
 84                 int nBytesRec = sock.EndReceive(ar);
 85                 if (nBytesRec > 0)
 86                 {
 87                     byte[] recievedNowBuff = new byte[nBytesRec];
 88                     Array.Copy(msgBuff, recievedNowBuff, nBytesRec);
 89                     try
 90                     {
 91                         AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
 92                         sock.BeginReceive(msgBuff, 0, msgBuff.Length, SocketFlags.None, recieveData, sock);
 93                     }
 94                     catch (Exception ex)
 95                     {
 96                         Console.WriteLine("接收回调函数设置失败 {0}", ex.Message);
 97                     }
 98 
 99                     System.Threading.Thread t1 = new System.Threading.Thread(delegate() { ProcessMessageeEnvent(sock, recievedNowBuff, getDataTime); });
100                     t1.Start();
101                 }
102                 else
103                 {
104                     Console.WriteLine("连接中断 {0}", sock.RemoteEndPoint);
105                     EndPoint tempRemoteEP = sock.RemoteEndPoint;
106                     IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
107                     string rempip = tempRemoteIP.Address.ToString();
108                     string remoport = tempRemoteIP.Port.ToString();
109                     sock.Shutdown(SocketShutdown.Both);
110                     sock.Close();
111                     ClientShutDownEnvent(rempip, remoport);
112                 }
113             }
114             catch (Exception ex)
115             {
116                 Console.WriteLine(ex.Message, "未知错误!");
117             }
118         }
119     }
120 
121 }

调用类:

 

 SICOMSocket.SocketAsyncServer SAC = new SICOMSocket.SocketAsyncServer();
        
byte ServerID;
        
public void Start(byte ServerID)
        {
            
this.ServerID = ServerID;
            SAC.ClientShutDownEnvent 
+= new SICOMSocket.SocketAsyncServer.ClientShutDownDelegate(SAC_ClientShutDownEnvent);
            SAC.NewConnectEnvent 
+= new SICOMSocket.SocketAsyncServer.NewConnectDelegate(SAC_NewConnectEnvent);
            SAC.ProcessMessageeEnvent 
+= new SICOMSocket.SocketAsyncServer.ProcessMessageeDelegate(SAC_ProcessMessageeEnvent);
            SAC.Start(
502);
        }
void SAC_NewConnectEnvent(string IP, string port, System.Net.Sockets.Socket clinetSocket)
        {
            Console.WriteLine(DateTime.Now.ToString() 
+ "监听到一个新的连接:对方IP[" + IP + "]" + "对方端口[" + port + "]");
        }

        
void SAC_ClientShutDownEnvent(string IP, string port)
        {
            Console.WriteLine(DateTime.Now.ToString() 
+ "连接中断:对方IP[" + IP + "]" + "对方端口[" + port + "]");
        }

 

posted on 2011-05-19 23:33 badnewfish 阅读(50) 评论(0) 编辑 收藏

导航

<2011年5月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

公告


点击这里给我发消息 
北京礼品网

巴顿的博客

昵称:badnewfish
园龄:5年3个月
粉丝:2
关注:0

搜索

 

常用链接

我的标签

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜