/// <summary> /// 判断 继续等待登录 /// </summary> /// <param name="obj"></param> private void WaitLoginAgain(ConnectObject obj) { if (obj != null && obj.Enabled) { if ((DateTime.Now - obj.ConnectTime).TotalSeconds > 30) { //连接登录超时 FirstCloseClient(obj); } else { FirstReceive(obj); } } }
//string ReceiveCallback(IAsyncResult ar, ClientFather obj) //{ // string msg = null; // int index = 0; // int bsize = 0; // int txLength = 0; // string rtMsg = null; ; // try // { // bsize = obj.ConnSocket.workSocket.EndReceive(ar); // if (bsize > 0) // { // obj.ConnSocket.sb.Append(HexBytes.BytesToHex(obj.ConnSocket.buffer, 0, bsize)); // msg = obj.ConnSocket.sb.ToString(); // Console.WriteLine(string.Format("DATA:{0}", HexBytes.BytesToHex(obj.ConnSocket.buffer, 0, bsize))); // index = msg.IndexOf("BDBDBD"); // if (index < 0) // { // obj.ConnSocket.sb = new StringBuilder(); // } // else // { // if (msg.Length - index >= 32) // { // txLength = 32 + 2 * Convert.ToInt32(msg.Substring(index + 28, 4), 16) + 4; // if (msg.Length >= index + txLength) // { // obj.ConnSocket.sb = new StringBuilder(msg.Substring(index + txLength)); // //DoWork(msg.Substring(index, 32 + Convert.ToInt32(msg.Substring(index + 29, 2), 16) + 2)); // rtMsg = msg.Substring(index, txLength); // } // } // } // } // } // catch (Exception ex) // { // SocketError(obj, ex.Message); // } // return rtMsg; //} string ReceiveCallback(IAsyncResult ar, ConnectObject obj) { string msg = null; int index = 0; int bsize = 0; int txLength = 0; string rtMsg = null; ; try { bsize = obj.workSocket.EndReceive(ar); if (bsize > 0) { obj.sb.Append(HexBytes.BytesToHex(obj.buffer, 0, bsize)); msg = obj.sb.ToString(); Console.WriteLine(string.Format("DATA:{0}", HexBytes.BytesToHex(obj.buffer, 0, bsize))); index = msg.IndexOf("BDBDBD", StringComparison.Ordinal); if (index < 0) { obj.sb = new StringBuilder(); } else { if (msg.Length - index >= 32) { txLength = 32 + 2 * Convert.ToInt32(msg.Substring(index + 28, 4), 16) + 4; if (msg.Length >= index + txLength) { obj.sb = new StringBuilder(msg.Substring(index + txLength)); //DoWork(msg.Substring(index, 32 + Convert.ToInt32(msg.Substring(index + 29, 2), 16) + 2)); rtMsg = msg.Substring(index, txLength); } } } } } catch (Exception ex) { FirstSocketError(obj, ex.Message); } return rtMsg; }
//SOCKET异常 void FirstSocketError(ConnectObject obj, string errmsg) { if (obj.Enabled) { obj.Enabled = false; obj.workSocket.Shutdown(SocketShutdown.Both); obj.workSocket.Close(); //ClientList.Remove(obj); //if (SocketErrorEvent != null) //{ // SocketErrorEvent.BeginInvoke(obj, errmsg, null, null); //} } }
//登录成功前的数据接收 void FirstReceive(ConnectObject conn) { try { conn.workSocket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, p => { string msg = ReceiveCallback(p, conn); if (msg != null) { if (LoginingEvent != null) { try { LoginingEvent.BeginInvoke(conn, msg, m => { var client = LoginingEvent.EndInvoke(m); if (client.IsLogin == true) { //登录成功 client.LoginTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); client.LoginTxData = msg; if (LoginSuccessEvent != null) { LoginSuccessEvent.BeginInvoke(client, null, null); } //开始正常接收数据 Receive(client); } else { //登录失败 WaitLoginAgain(conn); } }, null); } catch { WaitLoginAgain(conn); } } else { WaitLoginAgain(conn); } } else { WaitLoginAgain(conn); } }, conn); } catch (Exception ex) { FirstSocketError(conn, ex.Message); } }
//接收新连接 void Accept() { ConnectObject obj = new ConnectObject(); socketListener.BeginAccept(p => { obj.ConnectTime = DateTime.Now; //obj.IsLogin = false; obj.Enabled = true; try { var socket = socketListener.EndAccept(p); obj.workSocket = socket; obj.IP = ((IPEndPoint)obj.workSocket.RemoteEndPoint).Address.ToString(); obj.port = ((IPEndPoint)obj.workSocket.RemoteEndPoint).Port; //ClientList.Add(obj); if (ConnectNewEvent != null) ConnectNewEvent.BeginInvoke((IPEndPoint)socket.RemoteEndPoint, null, null); FirstReceive(obj); } catch { } Accept(); }, null); }
public void FirstCloseClient(ConnectObject obj) { if (obj.Enabled) { obj.Enabled = false; obj.workSocket.Shutdown(SocketShutdown.Both); obj.workSocket.Close(); //ClientList.Remove(obj); //if (SocketCloseEvent != null) //{ // SocketCloseEvent.BeginInvoke(obj, null, null); //} } }