private void ReadCallback(IAsyncResult ar) { WeaveNetWorkItems workItem = (WeaveNetWorkItems)ar.AsyncState; Socket handler = workItem.SocketSession; try { int bytesRead = 0; try { bytesRead = handler.EndReceive(ar); } catch { //netc.Soc.Close(); //listconn.Remove(netc); } byte[] tempbtye = new byte[bytesRead]; if (bytesRead > 0) { Array.Copy(workItem.Buffer, 0, tempbtye, 0, bytesRead); workItem.DataList.Add(tempbtye); } } catch { } //handler.BeginReceive(netc.Buffer, 0, netc.BufferSize, 0, new AsyncCallback(ReadCallback), netc); }
void ReceivePageHander(object ias) { while (true) { try { WeaveNetWorkItems[] netlist = new WeaveNetWorkItems[weaveNetworkItems.Count]; weaveNetworkItems.CopyTo(netlist); foreach (WeaveNetWorkItems netc in netlist) { if (netc.DataList.Count > 0) { if (!netc.IsPage) { netc.IsPage = true; ThreadPool.QueueUserWorkItem(new WaitCallback(packageData), netc); //System.Threading.Thread t = new System.Threading.Thread(new ParameterizedThreadStart(packageData)); //t.Start(netc); //Webp2psever.packageDataHandler pdh = new Webp2psever.packageDataHandler(packageData); //pdh.BeginInvoke(netc, endpackageData, null); } } } System.Threading.Thread.Sleep(10); } catch { } } }
void AcceptHander(object ias) { var UpdateSocketListEventHandercback = new System.Threading.WaitCallback(UpdateSocketListEventHander); while (true) { Socket handler = socketLisener.Accept(); //连接到服务器的客户端Socket封装类 WeaveNetWorkItems netc = new WeaveNetWorkItems(); if (Certificate != null) { netc.Stream = Authenticate(handler, Certificate, SslProtocols.Default); netc.Stream.AuthenticateAsServer(Certificate, false, SslProtocols.Tls, true); } netc.SocketSession = handler; weaveNetworkItems.Add(netc); if (Setherd(netc, 1)) { System.Threading.ThreadPool.QueueUserWorkItem( UpdateSocketListEventHandercback, handler); } } }
void packageDataHander(WeaveNetWorkItems netc) { // WeaveNetWorkItems netc= ar.AsyncState as WeaveNetWorkItems; // Console.WriteLine("packageDataHander:" + netc.allDataList.Length); netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList); netc.IsPage = false; // Console.WriteLine("netc.IsPage:" + netc.IsPage); }
void packageDataHanderobj(object obj) { WeaveNetWorkItems netc = obj as WeaveNetWorkItems; // Console.WriteLine("packageDataHanderobj:" + netc.allDataList.Length); netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList); netc.IsPage = false; // Console.WriteLine("netc.IsPage:" + netc.IsPage); }
void AcceptHander(object ias) { while (true) { Socket handler = socketLisener.Accept(); //连接到服务器的客户端Socket封装类 WeaveNetWorkItems netc = new WeaveNetWorkItems(); netc.SocketSession = handler; weaveNetworkItems.Add(netc); System.Threading.ThreadPool.QueueUserWorkItem( new System.Threading.WaitCallback(UpdateSocketListEventHander), handler); } }
private void ReadCallbackssl(object ar) { WeaveNetWorkItems netc = (WeaveNetWorkItems)ar; SslStream stream = netc.Stream; byte[] buffer = new byte[20480]; // StringBuilder messageData = new StringBuilder(); int byteCount = -1; List <byte> listb = new List <byte>(); do { byteCount = stream.Read(buffer, 0, buffer.Length); listb.AddRange(buffer.Take(byteCount)); } while (byteCount <= 2); // netc.DataList.Add(listb.ToArray()); netc.Buffer = listb.ToArray(); if (netc.Buffer.Length <= 0) { netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList); netc.IsPage = false; //ar.AsyncWaitHandle.Close(); return; } else { int bytesRead = netc.Buffer.Length; byte[] tempbtye = new byte[bytesRead]; Array.Copy(netc.Buffer, 0, tempbtye, 0, tempbtye.Length); int lle = netc.allDataList.Length; byte[] temp = new byte[lle + tempbtye.Length]; Array.Copy(netc.allDataList, 0, temp, 0, netc.allDataList.Length); Array.Copy(tempbtye, 0, temp, lle, bytesRead); netc.allDataList = temp; //workItem.DataList.Add(tempbtye) netc.allDataList = packageData(netc.allDataList, netc.SocketSession, netc.Stream, netc.tempDataList); netc.IsPage = false; return; } }
void ReceiveHander(object ias) { while (true) { try { int c = weaveNetworkItems.Count; int count = (c / Partition) + 1; getbufferdelegate[] iagbd = new getbufferdelegate[count]; IAsyncResult[] ia = new IAsyncResult[count]; if (c > 0) { WeaveNetWorkItems[] netlist = new WeaveNetWorkItems[c]; weaveNetworkItems.CopyTo(0, netlist, 0, c); getbuffer(netlist, 0, Partition); } } catch { } System.Threading.Thread.Sleep(1); } }
void KeepAliveHander(object obj) { while (true) { try { WeaveNetWorkItems[] workItems = new WeaveNetWorkItems[weaveNetworkItems.Count]; weaveNetworkItems.CopyTo(workItems); foreach (WeaveNetWorkItems workItem in workItems) { if (workItem == null) { continue; } Thread.Sleep(1); try { byte[] b = new byte[] { 0x99 }; workItem.SocketSession.Send(b); workItem.ErrorNum = 0; } catch { workItem.ErrorNum += 1; if (workItem.ErrorNum > 3) { System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(DeleteSocketListEventHander), workItem.SocketSession); weaveNetworkItems.Remove(workItem); } } } Thread.Sleep(5000); // GC.Collect(); } catch { } } }
void getbuffer(WeaveNetWorkItems[] netlist, int index, int len) { for (int i = index; i < len; i++) { if (i >= netlist.Length) { return; } try { WeaveNetWorkItems netc = netlist[i]; if (netc.SocketSession != null) { if (netc.SocketSession.Available > 0) { netc.SocketSession.BeginReceive(netc.Buffer = new byte[netc.SocketSession.Available], 0, netc.Buffer.Length, 0, new AsyncCallback(ReadCallback), netc); } } } catch { } } }
/// <summary> /// 对粘包,分包的处理方法 /// </summary> /// <param name="obj"></param> private void packageData(object obj) { WeaveNetWorkItems netc = obj as WeaveNetWorkItems; List <byte[]> ListData = netc.DataList; try { int i = 0; int count = ListData.Count; if (count > 0) { int bytesRead = ListData[i] != null ? ListData[i].Length : 0; if (bytesRead == 0) { if (ListData.Count > 0) { ListData.RemoveAt(0); } netc.IsPage = false; return; } ; byte[] tempbtye = new byte[bytesRead]; Array.Copy(ListData[i], tempbtye, tempbtye.Length); if (bytesRead > 2) { int a = tempbtye[1]; if (bytesRead > 2 + a) { int len = 0; if (weaveDataType == WeaveDataTypeEnum.Bytes) { byte[] bb = new byte[a]; Array.Copy(tempbtye, 2, bb, 0, a); len = ConvertToInt(bb); } else { String temp = System.Text.Encoding.UTF8.GetString(tempbtye, 2, a); len = int.Parse(temp); } if ((len + 2 + a) > tempbtye.Length) { try { if (ListData.Count > 1) { ListData.RemoveAt(i); byte[] temps = new byte[tempbtye.Length]; Array.Copy(tempbtye, temps, temps.Length); byte[] tempbtyes = new byte[temps.Length + ListData[i].Length]; Array.Copy(temps, tempbtyes, temps.Length); Array.Copy(ListData[i], 0, tempbtyes, temps.Length, ListData[i].Length); ListData[i] = tempbtyes; } } catch { } netc.IsPage = false; return; } else if (tempbtye.Length > (len + 2 + a)) { try { byte[] temps = new byte[tempbtye.Length - (len + 2 + a)]; Array.Copy(tempbtye, (len + 2 + a), temps, 0, temps.Length); ListData[i] = temps; } catch { } // netc.Ispage = false; return; } else if (tempbtye.Length == (len + 2 + a)) { if (ListData.Count > 0) { ListData.RemoveAt(i); } } try { if (weaveDataType == WeaveDataTypeEnum.Json) { String temp = System.Text.Encoding.UTF8.GetString(tempbtye, 2 + a, len); WeaveEvent me = new WeaveEvent(); me.Command = tempbtye[0]; me.Data = temp; me.Soc = netc.SocketSession; if (waveReceiveEvent != null) { System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveEventHander), me); } //receiveeventto(me); //if (receiveevent != null) // receiveevent.BeginInvoke(tempbtye[0], temp, netc.Soc, null, null); //if (ListData.Count > 0) ListData.RemoveAt(i); } else if (weaveDataType == WeaveDataTypeEnum.Bytes) { // temp = System.Text.Encoding.UTF8.GetString(tempbtye, 2 + a, len); byte[] bs = new byte[len]; Array.Copy(tempbtye, (2 + a), bs, 0, bs.Length); WeaveEvent me = new WeaveEvent(); me.Command = tempbtye[0]; me.Data = ""; me.Databit = bs; me.Soc = netc.SocketSession; if (weaveReceiveBitEvent != null) { System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveBitEventHander), me); } } netc.IsPage = false; return; } catch //(Exception e) { netc.IsPage = false; return; } } else { if (ListData.Count > 0) { ListData.RemoveAt(i); byte[] temps = new byte[tempbtye.Length]; Array.Copy(tempbtye, temps, temps.Length); byte[] tempbtyes = new byte[temps.Length + ListData[i].Length]; Array.Copy(temps, tempbtyes, temps.Length); Array.Copy(ListData[i], 0, tempbtyes, temps.Length, ListData[i].Length); ListData[i] = tempbtyes; } netc.IsPage = false; return; } } else { try { if (ListData.Count > 1) { ListData.RemoveAt(i); byte[] temps = new byte[tempbtye.Length]; Array.Copy(tempbtye, temps, temps.Length); byte[] tempbtyes = new byte[temps.Length + ListData[i].Length]; Array.Copy(temps, tempbtyes, temps.Length); Array.Copy(ListData[i], 0, tempbtyes, temps.Length, ListData[i].Length); ListData[i] = tempbtyes; } } catch { } netc.IsPage = false; return; } } } catch //(Exception e) { try { if (netc.DataList.Count > 0) { netc.DataList.RemoveAt(0); } netc.IsPage = false; } catch { } return; } finally { netc.IsPage = false; } }
bool getbuffer(List <WeaveNetWorkItems> netlist, int index, int len) { var bb = true; for (int i = index; i < len; i++) { if (i >= netlist.Count) { return(bb); } try { WeaveNetWorkItems netc = netlist[i]; if (netc.SocketSession != null) { if (netc.SocketSession.Available > 0 || netc.allDataList.Length > 0) { bb = false; } if (!netc.IsPage && Setherd(netc)) { // if (netc.SocketSession.Available > 0 || netc.allDataList.Length > 3) if (Certificate != null) { SslStream sslStream = netc.Stream; if (sslStream.IsAuthenticated) { netc.IsPage = true; ThreadPool.QueueUserWorkItem(new WaitCallback(ReadCallbackssl), netc); } } else { if (netc.SocketSession.Available > 0) { dt = DateTime.Now; netc.IsPage = true; // netc.SocketSession.ReceiveAsync // Console.WriteLine((netc.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+接收:" + netc.SocketSession.Available); netc.SocketSession.BeginReceive(netc.Buffer = new byte[netc.SocketSession.Available], 0, netc.Buffer.Length, 0, ReadCallbackasty, netc); } else if (netc.allDataList.Length > 0) { dt = DateTime.Now; netc.IsPage = true; // Console.WriteLine((netc.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+剩余:" + netc.allDataList.Length); // netc.SocketSession.ReceiveAsync System.Threading.ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(packageDataHanderobj), netc); // packageDatacall.BeginInvoke(netc, callBackMethod, packageDatacall); //netc.SocketSession.BeginReceive(netc.Buffer = new byte[netc.SocketSession.Available], 0, netc.Buffer.Length, 0, ReadCallbackasty, netc); } // // Console.WriteLine((netc.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+剩余:" + netc.allDataList.Length); } } } } catch { } } return(bb); }
private void ReadCallback(IAsyncResult ar) { WeaveNetWorkItems workItem = (WeaveNetWorkItems)ar.AsyncState; Socket handler = workItem.SocketSession; try { int bytesRead = 0; try { bytesRead = handler.EndReceive(ar); if (bytesRead <= 0) { if (workItem.allDataList.Length > 3) { workItem.allDataList = packageData(workItem.allDataList, workItem.SocketSession, workItem.Stream, workItem.tempDataList); } workItem.IsPage = false; //DateTime dt3 = DateTime.Now; //Console.WriteLine((dt3 - dt).TotalMilliseconds); //ar.AsyncWaitHandle.Close(); return; } } catch { //netc.Soc.Close(); //listconn.Remove(netc); } bytesRead = workItem.Buffer.Length; byte[] tempbtye = new byte[bytesRead]; //if (bytesRead > 0) { Buffer.BlockCopy(workItem.Buffer, 0, tempbtye, 0, tempbtye.Length); int lle = workItem.allDataList.Length; byte[] temp = new byte[lle + tempbtye.Length]; Buffer.BlockCopy(workItem.allDataList, 0, temp, 0, workItem.allDataList.Length); // Array.Copy(workItem.allDataList, 0, temp, 0, workItem.allDataList.Length); Buffer.BlockCopy(tempbtye, 0, temp, lle, bytesRead); workItem.allDataList = temp; //workItem.DataList.Add(tempbtye); workItem.allDataList = packageData(workItem.allDataList, workItem.SocketSession, workItem.Stream, workItem.tempDataList); // Console.WriteLine((workItem.SocketSession.RemoteEndPoint as IPEndPoint).Address.ToString() + "+ReadCallback:" + workItem.allDataList.Length); //if (workItem.SocketSession.Available > 0) //{ // workItem.SocketSession.BeginReceive(workItem.Buffer = new byte[workItem.SocketSession.Available], 0, workItem.Buffer.Length, 0, ReadCallbackasty, workItem); //} //else workItem.IsPage = false; } //DateTime dt2 = DateTime.Now; //Console.WriteLine((dt2 - dt).TotalMilliseconds); } catch (Exception ee) { // Console.WriteLine("ReadCallback:" + ee.Message); } }
protected virtual void KeepAliveHander(object obj) { var DeleteSocketListEventHandercallback = new System.Threading.WaitCallback(DeleteSocketListEventHander); while (true) { try { WeaveNetWorkItems[] workItems = new WeaveNetWorkItems[weaveNetworkItems.Count]; weaveNetworkItems.CopyTo(workItems); foreach (WeaveNetWorkItems workItem in workItems) { if (workItem == null) { continue; } // Thread.Sleep(1); try { byte[] b = new byte[] { 0x99 }; var ok = false; if (!Setherd(workItem, 1)) { ok = true; } else { if (Certificate != null) { if (weaveDataType == WeaveDataTypeEnum.custom) { // b = new byte[1]; ok = Send(workItem.Stream, new byte[1]); } else { ok = Send(workItem.Stream, 0x99, b); } } else { if (weaveDataType == WeaveDataTypeEnum.custom) { // b = new byte[1]; ok = Send(workItem.SocketSession, new byte[1]); } else { ok = Send(workItem.SocketSession, 0x99, b); } } } // ok = Send(workItem.SocketSession, new byte[1]); if (!ok) { workItem.ErrorNum += 1; if (workItem.ErrorNum >= 1) { System.Threading.ThreadPool.UnsafeQueueUserWorkItem(DeleteSocketListEventHandercallback, workItem.SocketSession); weaveNetworkItems.Remove(workItem); } } else { workItem.ErrorNum = 0; } // workItem.SocketSession.Send(b); } catch { workItem.ErrorNum += 1; if (workItem.ErrorNum >= 1) { System.Threading.ThreadPool.UnsafeQueueUserWorkItem( DeleteSocketListEventHandercallback, workItem.SocketSession); try { weaveNetworkItems.Remove(workItem); } catch (Exception EX_NAME) { // Console.WriteLine(EX_NAME); //throw; } } } } Thread.Sleep(5000); GC.Collect(); } catch { } } }
protected virtual bool Setherd(WeaveNetWorkItems netc, int xintiao = 0) { return(true); }