zoukankan      html  css  js  c++  java
  • Socket 异步通信

    最近在写数据通信的时候用到的东西!希望对大家有帮助
       1         /// <summary>
       2         /// 获取或设置服务器IP地址
       3         /// </summary>
       4         public string serverIP = "";
       5         /// <summary>
       6         /// 获取或设置服务器端口
       7         /// </summary>
       8         public int serverPort = 0;
       9         /// <summary>
      10         /// 连接对象
      11         /// </summary>
      12         private Socket conn = null;
      13         /// <summary>
      14         /// 监听连接对象
      15         /// </summary>
      16         private Socket listenSocket = null;
      17         /// <summary>
      18         /// 是否停止收发数据(true:停止收发;false:可以收发)
      19         /// </summary>
      20         private volatile bool stopFlag = true;
      21         /// <summary>
      22         /// 是否连接已断开(true:已断开;false:已连接)
      23         /// </summary>
      24         public volatile bool isSocketBroken = true;
      25         private ManualResetEvent allDone = new ManualResetEvent(false);
      26         /// <summary>
      27         /// 抛出接收到的数据的事件
      28         /// </summary>
      29         public event NetInfoEventHandler.InfoEvent infoEvent;
      30         /// <summary>
      31         /// 抛出异常处理的事件
      32         /// </summary>
      33         public event ExceptionEventHandler.ExceptionEvent exceptionEvent;
      34 
      35         /// <summary>
      36         /// 可以重连的次数,默认不重连
      37         /// </summary>
      38         public int canReconnectNum = 0;
      39         /// <summary>
      40         /// 已经重连的次数
      41         /// </summary>
      42         public int ReconnectedNum = 0;
      43 
      44         /// <summary>
      45         /// 连接成功编码
      46         /// </summary>
      47         public static string SUCCESS_CONNECT = "SUCCESS";
      48         /// <summary>
      49         /// 连接异常编码
      50         /// </summary>
      51         public static string EXCEPTION_CONNECT = "CONNECT";
      52         /// <summary>
      53         /// 接收异常编码
      54         /// </summary>
      55         public static string EXCEPTION_RECEIVE = "RECEIVE";
      56         /// <summary>
      57         /// 发送异常编码
      58         /// </summary>
      59         public static string EXCEPTION_SEND = "SEND";
      60         /// <summary>
      61         /// 数据内容起始位置
      62         /// </summary>
      63         public static int GOOD_PARSER_OFFSET = 8;
      64 
      65         /// <summary>
      66         /// 写异常log的对象
      67         /// </summary>
      68         public WriteLog exceptionMsgLog;
      69         /// <summary>
      70         /// 最新接收到的数据
      71         /// </summary>
      72         public byte[] read;
      73         /// <summary>
      74         /// 最新发送的数据
      75         /// </summary>
      76         public byte[] write;
      77         /// <summary>
      78         /// 接收数据的任务
      79         /// </summary>
      80         private Task receiveDataTask;
      81         /// <summary>
      82         ///监听连接的任务
      83         /// </summary>
      84         private Task lisenerTask;
      85         /// <summary>
      86         /// 数据开始标志
      87         /// </summary>
      88         private char DataBeginChar = '{';
      89         /// <summary>
      90         /// 数据结束标志
      91         /// </summary>
      92         private char DataEndChar = '}';
      93         /// <summary>
      94         /// 存放不完整的数据
      95         /// </summary>
      96         public byte[] totalReadByte;
      97         public Socket workSocket = null;
      98 
      99         public Connection()
     100         {
     101         }
     102 
     103         /// <summary>
     104         /// 构造函数
     105         /// </summary>
     106         /// <param name="serverIp"></param>
     107         /// <param name="serverPort"></param>
     108         /// <param name="errorLog"></param>
     109         public Connection(string serverIp,int serverPort,WriteLog errorLog)
     110         {
     111             this.serverIP = serverIp;
     112             this.serverPort = serverPort;
     113             this.exceptionMsgLog = errorLog;
     114         }
     115 
     116         /// <summary>
     117         /// 构造函数
     118         /// </summary>
     119         /// <param name="serverIp"></param>
     120         /// <param name="serverPort"></param>
     121         /// <param name="errorLog"></param>
     122         public Connection(string serverIp, int serverPort,int receiveBufferSize,int sendBufferSize, WriteLog errorLog)
     123         {
     124             this.serverIP = serverIp;
     125             this.serverPort = serverPort;
     126             this.exceptionMsgLog = errorLog;
     127             this.read = new byte[receiveBufferSize];
     128             this.write = new byte[sendBufferSize];
     129         }
     130 
     131         /// <summary>
     132         /// 建立连接
     133         /// </summary>
     134         /// <returns></returns>
     135         public bool connect()
     136         {
     137             bool ret = false;
     138 
     139             try
     140             {
     141                 //初始化
     142                 this.conn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     143                 //开始连接
     144                 this.conn.Connect(this.serverIP, this.serverPort);
     145                 //连接成功,状态设置成已连接
     146                 this.isSocketBroken = false;
     147                 //开始接收数据
     148                 this.stopFlag = false;
     149                 if (this.read == null)
     150                 {
     151                     this.read = new byte[this.conn.ReceiveBufferSize];
     152                 }
     153                 if (this.write == null)
     154                 {
     155                     this.write = new byte[this.conn.SendBufferSize];
     156                 }
     157                 //异步接收数据
     158                 SocketError socketErr;
     159                 this.conn.BeginReceive(this.read, 0, this.read.Length, SocketFlags.None, out socketErr, new AsyncCallback(ReadCallback), this);
     160                 //启动后台任务同步接收数据
     161                 //this.receiveDataTask = new Task(() => this.syncReceive(this.conn, 0));
     162                 //this.receiveDataTask.Start();
     163                 //allDone.Set();
     164 
     165                 //连接处理成功
     166                 onConnectSuccess();
     167                 ret = true;
     168             }
     169             catch (Exception ex)
     170             {
     171                 if (this.exceptionMsgLog != null)
     172                 {
     173                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     174                 }
     175                 onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(),EXCEPTION_CONNECT);
     176             }
     177 
     178             return ret;
     179         }
     180 
     181         /// <summary>
     182         /// 连接成功的处理
     183         /// </summary>
     184         private void onConnectSuccess()
     185         {
     186             try
     187             {
     188                 //把收到的对象转发给外面的事件
     189                 if (this.exceptionEvent != null)
     190                 {
     191                     exceptionEvent(this, new ExceptionEventHandler("", SUCCESS_CONNECT));
     192                 }
     193                 //重连次数清零
     194                 this.ReconnectedNum = 0;
     195             }
     196             catch (Exception ex)
     197             {
     198                 if (this.exceptionMsgLog != null)
     199                 {
     200                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     201                 }
     202             }
     203         }
     204 
     205         /// <summary>
     206         /// 连接出现异常的处理
     207         /// </summary>
     208         private void onConnectException(string exceptionInfo,string exceptionCode)
     209         {
     210             try 
     211             {
     212                 //把收到的对象转发给外面的事件
     213                 if (this.exceptionEvent != null)
     214                 {
     215                     exceptionEvent(this, new ExceptionEventHandler(exceptionInfo, exceptionCode));
     216                 }
     217                 //是否要重连
     218                 if (this.canReconnectNum > 0)
     219                 {
     220                     if (this.ReconnectedNum < this.canReconnectNum)
     221                     {
     222                         this.ReconnectedNum++;
     223                         if (this.conn != null)
     224                         {
     225                             this.disconnect();
     226                         }
     227                         this.connect();
     228                     }
     229                 }
     230                 else
     231                 {
     232                     this.isSocketBroken = true;
     233                     if (this.conn != null)
     234                     {
     235                         this.disconnect();
     236                     }
     237                 }
     238             }
     239             catch (Exception ex)
     240             {
     241                 if (this.exceptionMsgLog != null)
     242                 {
     243                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     244                 }
     245             }
     246         }
     247 
     248         /// <summary>
     249         /// 接收数据出现异常的处理
     250         /// </summary>
     251         private void onReceiveException(string exceptionInfo, string exceptionCode)
     252         {
     253             try
     254             {
     255                 onConnectException(exceptionInfo, exceptionCode);
     256             }
     257             catch (Exception ex)
     258             {
     259                 if (this.exceptionMsgLog != null)
     260                 {
     261                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     262                 }
     263             }
     264         }
     265 
     266         /// <summary>
     267         /// 发送数据出现异常的处理
     268         /// </summary>
     269         private void onSendException(string exceptionInfo, string exceptionCode)
     270         {
     271             try
     272             {
     273                 onConnectException(exceptionInfo, exceptionCode);
     274             }
     275             catch (Exception ex)
     276             {
     277                 if (this.exceptionMsgLog != null)
     278                 {
     279                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     280                 }
     281             }
     282         }
     283 
     284         /// <summary>
     285         /// 建立连接
     286         /// </summary>
     287         /// <returns></returns>
     288         public bool lisenter()
     289         {
     290             bool ret = false;
     291 
     292             try
     293             {
     294                 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(this.serverIP), this.serverPort);
     295                 this.conn = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
     296                 this.conn.Bind(ipe);
     297                 //监听成功,状态设置成已连接
     298                 this.isSocketBroken = false;
     299                 //开始接收数据
     300                 this.stopFlag = false;
     301                 if (this.read == null)
     302                 {
     303                     this.read = new byte[this.conn.ReceiveBufferSize];
     304                 }
     305                 if (this.write == null)
     306                 {
     307                     this.write = new byte[this.conn.SendBufferSize];
     308                 }
     309                 //启动后台任务监听连接
     310                 this.lisenerTask = new Task(() => this.startListen());
     311                 this.lisenerTask.Start();
     312                 allDone.Set();
     313 
     314                 //连接处理成功
     315                 ret = true;
     316             }
     317             catch (Exception ex)
     318             {
     319                 if (this.exceptionMsgLog != null)
     320                 {
     321                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     322                 }
     323                 onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_CONNECT);
     324             }
     325 
     326             return ret;
     327         }
     328 
     329         private void startListen()
     330         {
     331             try
     332             {
     333                 conn.Listen(100);
     334 
     335                 while (!stopFlag)
     336                 {
     337                     allDone.Reset();
     338 
     339                     // Start an asynchronous socket to listen for connections.
     340                     //Console.WriteLine("Waiting for a connection...");
     341                     try
     342                     {
     343                         conn.BeginAccept(new AsyncCallback(AcceptCallback), conn);
     344                     }
     345                     catch (Exception e)
     346                     {
     347                         //Console.WriteLine(e.ToString());
     348                     }
     349 
     350                     // Wait until a connection is made before continuing.
     351                     allDone.WaitOne();
     352                 }
     353             }
     354             catch (Exception ex)
     355             {
     356                 if (this.exceptionMsgLog != null)
     357                 {
     358                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     359                 }
     360                 onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_CONNECT);
     361             }
     362         }
     363 
     364         class ReadSocketState
     365         {
     366             public Socket socket;
     367             public volatile bool isStopFlag;
     368         }
     369         private ReadSocketState rss = null;
     370         public const int DATA_OFFSET = 4;
     371         public void AcceptCallback(IAsyncResult ar)
     372         {
     373             try
     374             {
     375                 Socket listenSocket = (Socket)ar.AsyncState;
     376                 Socket tempSocket = listenSocket.EndAccept(ar);
     377 
     378                 // Signal the main thread to continue.
     379                 allDone.Set();
     380 
     381                 Connection newConn = new Connection(listenSocket.AddressFamily.ToString(),0,this.exceptionMsgLog);
     382                 newConn.conn = tempSocket;
     383                 newConn.read = new byte[tempSocket.ReceiveBufferSize];
     384                 newConn.write = new byte[tempSocket.SendBufferSize];
     385                 newConn.isSocketBroken = false;
     386                 newConn.infoEvent += new NetInfoEventHandler.InfoEvent(ClientSocket_infoEvent);
     387                 newConn.exceptionEvent += new ExceptionEventHandler.ExceptionEvent(ClientSocket_ExceptionEvent);
     388                 //异步接收数据
     389                 SocketError socketErr;
     390                 newConn.conn.BeginReceive(newConn.read, 0, newConn.read.Length, SocketFlags.None, out socketErr, new AsyncCallback(ReadCallback), newConn);
     391                 ////启动后台任务同步接收数据
     392                 //Task newTask = new Task(() => newConn.syncReceive(newConn.conn, 0));
     393                 //newTask.Start();
     394                 //newConn.allDone.Set();
     395                 //通知有一个连接连上来了
     396                 if (this.exceptionEvent != null)
     397                 {
     398                     exceptionEvent(newConn, new ExceptionEventHandler("客户端有新的客户连进来了", SUCCESS_CONNECT));
     399                 }
     400 
     401                 //ThreadPool.QueueUserWorkItem(new WaitCallback(syncReceive), rss);
     402             }
     403             catch (Exception ex)
     404             {
     405                 if (this.exceptionMsgLog != null)
     406                 {
     407                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     408                 }
     409                 onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_CONNECT);
     410             }
     411             
     412         }
     413 
     414         public void ReadCallback(IAsyncResult ar)
     415         {
     416             Connection con = null;
     417             try
     418             {
     419                 con = (Connection)ar.AsyncState;
     420                 Socket socket = con.conn;
     421                 // Read data from the remote device.
     422                 SocketError socketErr;
     423                 int bytesRead = socket.EndReceive(ar, out socketErr);
     424 
     425                 string temp = Encoding.UTF8.GetString(con.read);
     426                 if (0 == bytesRead)
     427                 {
     428                     //errorLogger.log(ZDLogger.LVL_CRITCAL, CLASS_NM, "syncReceive", "Connection is broken!");
     429                     //throw new SocketException(System.Convert.ToInt32(SocketError.ConnectionReset));
     430                 }
     431                 else
     432                 {
     433                     if (temp.IndexOf("MARKET") < 0 && temp.IndexOf("TEST") < 0)
     434                     {
     435                         this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, temp);
     436                     }
     437                     string tmp = con.analyzeData(bytesRead, con);
     438 
     439                     //if (tmp.IndexOf("MARKET") < 0)
     440                     //{
     441                     //    this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, tmp);
     442                     //}
     443 
     444                     //转为后台线程处理读取的数据,不阻塞主线程对数据的读取
     445                     if (!string.IsNullOrEmpty(tmp))
     446                     {
     447                         this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, "启动任务前");
     448                         Task task = new Task(() => do_OneReceiveData(tmp, con));
     449                         task.Start();
     450                         this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, "启动任务后");
     451                     }
     452                 }
     453                 
     454                 //异步接收数据
     455                 //SocketError socketErr;
     456                 con.conn.BeginReceive(con.read, 0, con.read.Length, SocketFlags.None, out socketErr, new AsyncCallback(ReadCallback), con);
     457 
     458             }
     459             catch (SocketException se)
     460             {
     461                 if (this.exceptionMsgLog != null)
     462                 {
     463                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, se.StackTrace);
     464                 }
     465                 if (con != null)
     466                 {
     467                     con.onReceiveException(se.StackTrace, EXCEPTION_RECEIVE);
     468                 }
     469             }
     470             catch (Exception ex)
     471             {
     472                 if (this.exceptionMsgLog != null)
     473                 {
     474                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     475                 }
     476                 if (con != null)
     477                 {
     478                     con.onReceiveException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_RECEIVE);
     479                 }
     480             }
     481         }
     482 
     483         /// <summary>
     484         /// 接收到客户端一条数据的处理
     485         /// </summary>
     486         /// <param name="sender"></param>
     487         /// <param name="e"></param>
     488         private void ClientSocket_infoEvent(Connection sender, NetInfoEventHandler e)
     489         {
     490             try
     491             {
     492                 NetInfo netInfo = e.EventArg;
     493                 //心跳数据不处理
     494                 if (netInfo.code == CommandCode.HEARTBIT)
     495                 {
     496                     return;
     497                 }
     498                 if (this.infoEvent != null)
     499                 {
     500                     infoEvent(sender, new NetInfoEventHandler(netInfo));
     501                 }
     502                 
     503             }
     504             catch (Exception ex)
     505             {
     506                 this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     507             }
     508         }
     509 
     510         /// <summary>
     511         /// 接收到客户端异常的处理
     512         /// </summary>
     513         /// <param name="sender"></param>
     514         /// <param name="e"></param>
     515         private void ClientSocket_ExceptionEvent(Connection sender, ExceptionEventHandler e)
     516         {
     517             try
     518             {
     519                 string code = e.EventCode;
     520                 string msg = e.EventArg;
     521                 //把收到的对象转发给外面的事件
     522                 if (this.exceptionEvent != null)
     523                 {
     524                     exceptionEvent(sender, new ExceptionEventHandler(msg, code));
     525                 }
     526                 
     527             }
     528             catch (Exception ex)
     529             {
     530                 this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     531             }
     532         }
     533 
     534         public void syncReceive(object stateObj)
     535         {
     536             //ReadSocketState rss = (ReadSocketState)stateObj;
     537             //Socket socket = rss.socket;
     538             //try
     539             //{
     540             //    DateTime timeBegin = DateTime.Now;
     541 
     542             //    while (true)
     543             //    {
     544             //        if (socket == null || this.isSocketBroken)
     545             //        {
     546             //            continue;
     547             //        }
     548 
     549             //        //NetInfo netInfo = readClientRequestMsg(socket, 5000);
     550 
     551             //        if (socket.Poll(3000000, SelectMode.SelectRead)) // one-second timeout
     552             //        {
     553             //            int bytesRead = socket.Receive(this.read);
     554             //            //string temp = Encoding.UTF8.GetString(networkState.readBuffer);
     555             //            if (0 == bytesRead)
     556             //            {
     557             //                //errorLogger.log(ZDLogger.LVL_CRITCAL, CLASS_NM, "syncReceive", "Connection is broken!");
     558             //                throw new SocketException(System.Convert.ToInt32(SocketError.ConnectionReset));
     559             //            }
     560             //            string tmp = this.analyzeData(bytesRead);
     561 
     562             //            //转为后台线程处理读取的数据,不阻塞主线程对数据的读取
     563             //            if (!string.IsNullOrEmpty(tmp))
     564             //            {
     565             //                Task task = new Task(() => this.do_OneReceiveClientData(tmp, socket));
     566             //                task.Start();
     567             //            }
     568             //        }
     569 
     570             //        if (rss.isStopFlag)
     571             //        {
     572             //            socket.Close();
     573             //            break;
     574             //        }
     575             //    }
     576             //}
     577             //catch (System.ObjectDisposedException ode)
     578             //{
     579             //    // this exception means socket_ is already closed when poll() is called
     580             //    Console.WriteLine(ode.ToString());
     581             //}
     582             //catch (Exception ex)
     583             //{
     584             //    if (this.exceptionMsgLog != null)
     585             //    {
     586             //        this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     587             //    }
     588             //    onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_CONNECT);
     589             //}
     590 
     591         }
     592 
     593         public NetInfo readClientRequestMsg(Socket socket, int timeout)
     594         {
     595             try
     596             {
     597                 byte[] data = syncReceive(socket, timeout);
     598                 // Timeout
     599                 if (data == null) return null;
     600 
     601                 string msg = System.Text.ASCIIEncoding.ASCII.GetString(data, GOOD_PARSER_OFFSET, data.Length - GOOD_PARSER_OFFSET);
     602 
     603                 //errorLogger.log(ZDLogger.LVL_CRITCAL, msg);
     604 
     605                 NetInfo netInfo = new NetInfo();
     606                 netInfo.MyReadString(msg);
     607                 return netInfo;
     608             }
     609             catch (Exception ex)
     610             {
     611                 if (this.exceptionMsgLog != null)
     612                 {
     613                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     614                 }
     615                 onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_CONNECT);
     616                 return null;
     617             }
     618             
     619 
     620             
     621         }
     622 
     623         /// <summary>
     624         /// 断开连接
     625         /// </summary>
     626         /// <returns></returns>
     627         public bool disconnect()
     628         {
     629             bool ret = false;
     630 
     631             try
     632             {
     633                 //this.conn.Close();
     634                 this.conn.Disconnect(true);
     635                 //连接断开成功,状态设置成已断开
     636                 this.isSocketBroken = true;
     637                 this.stopFlag = true;
     638                 if (this.receiveDataTask != null)
     639                 {
     640                     this.receiveDataTask.Dispose();
     641                     this.receiveDataTask = null;
     642                 }
     643                 if (this.lisenerTask != null)
     644                 {
     645                     this.lisenerTask.Dispose();
     646                     this.lisenerTask = null;
     647                 }
     648                 allDone.Set();
     649 
     650                 //连接断开处理成功
     651                 ret = true;
     652             }
     653             catch (Exception ex)
     654             {
     655                 if (this.exceptionMsgLog != null)
     656                 {
     657                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     658                 }
     659                 onConnectException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_CONNECT);
     660             }
     661 
     662             return ret;
     663         }
     664 
     665         /// <summary>
     666         /// 同步接收数据(后台任务处理)
     667         /// </summary>
     668         /// <param name="socket"></param>
     669         /// <param name="timeout"></param>
     670         /// <returns></returns>
     671         private byte[] syncReceive(Socket socket, int timeout)
     672         {
     673             try
     674             {
     675                 DateTime timeBegin = DateTime.Now;
     676                 while (true)
     677                 {
     678                     if (socket == null || this.isSocketBroken)
     679                     {
     680                         continue;
     681                     }
     682 
     683                     if (socket.Poll(3000000, SelectMode.SelectRead)) // one-second timeout
     684                     {
     685                         int bytesRead = socket.Receive(this.read);
     686                         string temp = Encoding.UTF8.GetString(this.read);
     687                         if (0 == bytesRead)
     688                         {
     689                             //errorLogger.log(ZDLogger.LVL_CRITCAL, CLASS_NM, "syncReceive", "Connection is broken!");
     690                             throw new SocketException(System.Convert.ToInt32(SocketError.ConnectionReset));
     691                         }
     692                         if (temp.IndexOf("MARKET") < 0)
     693                         {
     694                             this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, temp);
     695                         }
     696                         string tmp = this.analyzeData(bytesRead,this);
     697 
     698                         //if (tmp.IndexOf("MARKET") < 0)
     699                         //{
     700                         //    this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, tmp);
     701                         //}
     702                         
     703                         //转为后台线程处理读取的数据,不阻塞主线程对数据的读取
     704                         if (!string.IsNullOrEmpty(tmp))
     705                         {
     706                             Task task = new Task(() => do_OneReceiveData(tmp,this));
     707                             task.Start();
     708                         }
     709                     }
     710                     else
     711                     {
     712                         //超时的话退出
     713                         //if (timeout != 0 && DateTime.Now.Subtract(timeBegin).TotalMilliseconds > timeout)
     714                             //break;
     715                     }
     716                 }
     717             }
     718             catch (System.ObjectDisposedException ode)
     719             {
     720                 if (this.exceptionMsgLog != null)
     721                 {
     722                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ode.StackTrace);
     723                 }
     724                 this.onReceiveException(ode.StackTrace, EXCEPTION_RECEIVE);
     725             }
     726             catch (Exception ex)
     727             {
     728                 if (this.exceptionMsgLog != null)
     729                 {
     730                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     731                 }
     732                 this.onReceiveException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_RECEIVE);
     733             }
     734 
     735             return null;
     736         }
     737 
     738         /// <summary>
     739         /// 处理接收到的完整对象数据
     740         /// </summary>
     741         /// <param name="inPut"></param>
     742         private void do_OneReceiveData(string inPut,Connection conn)
     743         {
     744             try
     745             {
     746                 int fir = inPut.IndexOf('{');
     747                 int sec = inPut.IndexOf('}');
     748                 while (fir != -1 && sec != -1)
     749                 {
     750                     string obj = inPut.Substring(fir + 1, sec - fir - 1);
     751                     inPut = inPut.Substring(sec + 1);//删除前面完整对象的字符串
     752                     //===========================//处理obj
     753                     fir = obj.IndexOf('(');
     754                     sec = obj.IndexOf(')');
     755                     string lenstr = obj.Substring(fir + 1, sec - 1);
     756                     lenstr = lenstr.Substring(4);
     757                     int len = int.Parse(lenstr);
     758                     obj = obj.Substring(sec + 1);//取完整对象的值
     759                     if (len == obj.Length) //完整正确的对象
     760                     {
     761                         NetInfo netInfo = new NetInfo();
     762                         netInfo.MyReadString(obj);
     763                         //把收到的对象转发给外面的事件
     764                         if (infoEvent != null)
     765                         {
     766                             conn.infoEvent(conn, new NetInfoEventHandler(netInfo));
     767                         }
     768                     }
     769                     fir = inPut.IndexOf('{');
     770                     sec = inPut.IndexOf('}');
     771                 }
     772             }
     773             catch (Exception ex)
     774             {
     775                 if (this.exceptionMsgLog != null)
     776                 {
     777                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     778                 }
     779             }
     780         }
     781 
     782         /// <summary>
     783         /// 处理接收到客户端请求的完整对象数据
     784         /// </summary>
     785         /// <param name="inPut"></param>
     786         private void do_OneReceiveClientData(string inPut,Connection socket)
     787         {
     788             try
     789             {
     790                 int fir = inPut.IndexOf('{');
     791                 int sec = inPut.IndexOf('}');
     792                 while (fir != -1 && sec != -1)
     793                 {
     794                     string obj = inPut.Substring(fir + 1, sec - fir - 1);
     795                     inPut = inPut.Substring(sec + 1);//删除前面完整对象的字符串
     796                     //===========================//处理obj
     797                     fir = obj.IndexOf('(');
     798                     sec = obj.IndexOf(')');
     799                     string lenstr = obj.Substring(fir + 1, sec - 1);
     800                     lenstr = lenstr.Substring(4);
     801                     int len = int.Parse(lenstr);
     802                     obj = obj.Substring(sec + 1);//取完整对象的值
     803                     if (len == obj.Length) //完整正确的对象
     804                     {
     805                         NetInfo netInfo = new NetInfo();
     806                         netInfo.MyReadString(obj);
     807                         //把收到的对象转发给外面的事件
     808                         if (infoEvent != null)
     809                         {
     810                             infoEvent(socket, new NetInfoEventHandler(netInfo));
     811                         }
     812                     }
     813                     fir = inPut.IndexOf('{');
     814                     sec = inPut.IndexOf('}');
     815                 }
     816             }
     817             catch (Exception ex)
     818             {
     819                 if (this.exceptionMsgLog != null)
     820                 {
     821                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     822                 }
     823             }
     824         }
     825 
     826 
     827         /// <summary>
     828         /// 解析当前接收的数据块,并将完整的数据返回(没有完整数据返回空)
     829         /// </summary>
     830         /// <param name="len"></param>
     831         /// <returns></returns>
     832         public string analyzeData(int len,Connection con)
     833         {
     834             try
     835             {
     836                 byte[] bytes = new byte[len];
     837                 List<byte> list = con.read.ToList();
     838                 //移除无效部分
     839                 list.RemoveRange(len, list.Count - len);
     840 
     841                 bytes = list.ToArray<byte>().Clone() as byte[];
     842 
     843                 Boolean begin = false;
     844                 string inPut = Encoding.UTF8.GetString(bytes);
     845                 Boolean end = inPut.EndsWith(con.DataEndChar.ToString());
     846                 if (inPut.ElementAt(0) == con.DataBeginChar)
     847                 {
     848                     begin = true;
     849                 }
     850 
     851                 if (begin && end)
     852                 {
     853                     //addByteToTotal(bytes);
     854                     return inPut;
     855                 }
     856                 else if (end) //处理最后的信息
     857                 {
     858 
     859                     addByteToTotal(bytes);
     860                     inPut = Encoding.UTF8.GetString(totalReadByte);
     861                     totalReadByte = null;
     862                     return inPut;
     863                 }
     864                 else //中间的
     865                 {
     866                     addByteToTotal(bytes);
     867                     inPut = Encoding.UTF8.GetString(totalReadByte);
     868                     int tEnd = inPut.LastIndexOf(con.DataEndChar);
     869                     string r = "";
     870                     string l = "";
     871                     if (tEnd >= 0)
     872                     {
     873                         r = inPut.Substring(0, tEnd + 1);
     874                         l = inPut.Substring(tEnd + 1);
     875                         if (l.Length > 0)
     876                         {
     877                             totalReadByte = Encoding.UTF8.GetBytes(l);
     878                         }
     879                     }
     880                     return r;
     881                 }
     882             }
     883             catch(Exception ex)
     884             {
     885                 if (this.exceptionMsgLog != null)
     886                 {
     887                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     888                 }
     889                 this.onReceiveException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_RECEIVE);
     890                 return "";
     891             }
     892         }
     893 
     894         /// <summary>
     895         /// 增加一个新读取的字节数组数据到总的字节数组数据中
     896         /// </summary>
     897         /// <param name="bytes"></param>
     898         public void addByteToTotal(byte[] bytes)
     899         {
     900             if (bytes == null) return;
     901             try
     902             {
     903                 lock (this)
     904                 {
     905                     //用来存放原来残余的数据
     906                     byte[] oldData = null;
     907                     //用来计算残余数据的长度
     908                     int Count = 0;
     909                     if (totalReadByte != null)
     910                     {
     911                         Count = totalReadByte.Length;
     912                     }
     913 
     914                     if (Count != 0)
     915                     {
     916                         oldData = (byte[])totalReadByte.Clone();
     917                     }
     918                     totalReadByte = new byte[Count + bytes.Length];
     919                     if (Count > 0)
     920                     {
     921                         oldData.CopyTo(totalReadByte, 0);
     922                     }
     923                     bytes.CopyTo(totalReadByte, Count);
     924                 }
     925             }
     926             catch (Exception ex)
     927             {
     928                 if (this.exceptionMsgLog != null)
     929                 {
     930                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     931                 }
     932                 this.onReceiveException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_RECEIVE);
     933             }
     934         }
     935                 
     936         /// <summary>
     937         /// 发送netinfo数据
     938         /// </summary>
     939         /// <param name="obj"></param>
     940         public void sendNetInfo(NetInfo obj)
     941         {
     942             try
     943             {
     944                 this.sendMsg(CommonFunction.ObjectStringToBytes(obj.MyToString()));
     945             }
     946             catch (Exception ex)
     947             {
     948                 if (this.exceptionMsgLog != null)
     949                 {
     950                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     951                 }
     952                 this.onSendException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_SEND);
     953             }
     954         }
     955 
     956         /// <summary>
     957         /// 发送数据
     958         /// </summary>
     959         /// <param name="data"></param>
     960         public void sendMsg(byte[] data)
     961         {
     962             try
     963             {
     964                 lock (this.conn)
     965                 {
     966                     int offset = 0;
     967                     int size = data.Length;
     968                     size += offset;
     969                     while (offset < size)
     970                     {
     971                         int count = this.conn.Send(data, offset, size - offset, SocketFlags.None);
     972                         offset += count;
     973                     }
     974                 }
     975             }
     976             catch (Exception ex)
     977             {
     978                 if (this.exceptionMsgLog != null)
     979                 {
     980                     this.exceptionMsgLog.log(LogLevel.SYSTEMERROR, ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString());
     981                 }
     982                 this.onSendException(ex.TargetSite + ex.Message + ex.StackTrace + ex.ToString(), EXCEPTION_SEND);
     983             }
     984         }
     985 
     986         /// <summary>
     987         /// 接收到一个完整数据的处理,在调用的类中实现这个方法来实现各自的处理逻辑
     988         /// </summary>
     989         /// <param name="rawMsg"></param>
     990         //public abstract void onReceiveData(string data);
     991 
     992         /// <summary>
     993         /// 接收到一个监听连接发来的完整数据的处理,在调用的类中实现这个方法来实现各自的处理逻辑
     994         /// </summary>
     995         /// <param name="rawMsg"></param>
     996         //public abstract void onReceiveClientData(string data, Socket socket);
     997 
     998         ///// <summary>
     999         ///// 接收数据出现异常的处理,在调用的类中实现这个方法来实现各自的处理逻辑
    1000         ///// </summary>
    1001         ///// <param name="rawMsg"></param>
    1002         //public abstract void onReceiveDataException();
    1003 
    1004         ///// <summary>
    1005         ///// 发送数据出现异常的处理,在调用的类中实现这个方法来实现各自的处理逻辑
    1006         ///// </summary>
    1007         ///// <param name="rawMsg"></param>
    1008         //public abstract void onSendDataException();
    1009         ///// <summary>
    1010         ///// 建立连接出现异常的处理,在调用的类中实现这个方法来实现各自的处理逻辑
    1011         ///// </summary>
    1012         ///// <param name="rawMsg"></param>
    1013         //public abstract void onConnectException();
    View Code
  • 相关阅读:
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵(6)--结合基于客户端和基于浏览器的控件
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵(5)--检查设计方案
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵(4)--考虑的因素
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵(3)--你的SP版本
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵(2)--数据在哪里?
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵(1)--表单模板
    一步步学习微软InfoPath2010和SP2010--第二章节--表单需求:使用决策矩阵
    一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(10)--关键点
    一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(9)--导出模板
    宋浩《概率论与数理统计》笔记---4.2.1、方差的定义
  • 原文地址:https://www.cnblogs.com/hongsedigua/p/3484126.html
Copyright © 2011-2022 走看看