private void StartSocketServer() { var tcpListener = new TcpListener(IPAddress.Any, 12580); tcpListener.Start(); this.RunInMainthread(() => { this.btn_Start.Text = "已启动"; this.btn_Start.Enabled = false; this.tir_Refrence.Start(); }); while (true) { if (!tcpListener.Pending()) { Thread.Sleep(100); continue; } Task.Run(() => { var account = string.Empty; using (var socket = tcpListener.AcceptSocket()) { var lastTime = DateTime.Now.AddMinutes(1); var bytes = new byte[1024]; while (true) { if (lastTime < DateTime.Now) { if (string.IsNullOrEmpty(cleaningDictionary.FirstOrDefault(f => f.Value == socket).Key)) { break; } LogFactory.Debug($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 关闭连接 程序ID=> {cleaningDictionary.FirstOrDefault(f => f.Value == socket).Key} account:{account} lastTime =>{lastTime:yyyy-MM-dd HH:mm:ss}"); Socket tempSockte; if (cleaningDictionary.TryRemove(account, out tempSockte)) { business.CleaningEnd(account); } break; } if (socket.Available == 0) { Thread.Sleep(100); continue; } lastTime = DateTime.Now.AddMinutes(1); socket.Receive(bytes, 0, 3, SocketFlags.None); var actionId = bytes[0]; if (cleaningDictionary.Any(f => f.Value == socket)) { LogFactory.Debug($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 收到心跳 程序ID=> {cleaningDictionary.FirstOrDefault(f => f.Value == socket).Key} lastTime =>{lastTime:yyyy-MM-dd HH:mm:ss}, Dic=>{JsonConvert.SerializeObject(cleaningDictionary.Select(s=>s.Key))}"); } var length = (short)(bytes[1] << 8 | bytes[2]); using (var stream = new MemoryStream()) { stream.Write(bytes, 0, 3); for (var i = 3; i < length; i += bytes.Length) { var readLength = length - i > bytes.Length ? bytes.Length : length - i; var len = 0; while (len != readLength) { len += socket.Receive(bytes, len, readLength - len, SocketFlags.None); } stream.Write(bytes, 0, readLength); } var streamBytes = stream.ToArray(); if (actionId == 0x01) { var waitCount = business.GetWaitCount(); socket.Send(new WaitMessagePackage { Id = 0x01, Length = 7, WaitCount = waitCount }.Serialize()); continue; } if (actionId == 0x02) { var checeCodeModel = business.GetCheckCode(); if (checeCodeModel == null) { socket.Send(new Package { Id = 0x06, Length = 3 }.Serialize()); continue; } var accountBytes = Encoding.UTF8.GetBytes(checeCodeModel.Account); var cookieBytes = Encoding.UTF8.GetBytes(checeCodeModel.Cookie); socket.Send(new CheckCodePackage { Id = 0x02, Length = (short)(cookieBytes.Length + accountBytes.Length + 15), CheckCodeId = checeCodeModel.Id, Cookie = cookieBytes, Status = checeCodeModel.Status, Type = checeCodeModel.Type, Account = accountBytes }.Serialize()); clientDictionary.AddOrUpdate(checeCodeModel.Id, k => socket, (k, v) => socket); continue; } if (actionId == 0x03) { var package = new CheckedResultPackage().DeSerialize(streamBytes); var accounts = business.CheckResult(package.CheckCodeId, package.Status, Encoding.UTF8.GetString(package.Account), Encoding.UTF8.GetString(package.HandleUser)); if (package.Status == 1) { foreach (var item in accounts) { Socket socketClient; if (!cleaningDictionary.TryGetValue(item, out socketClient)) { continue; } socketClient.Send(streamBytes); } } continue; } if (actionId == 0x04) { var package = new CleaningProcedurePackage().DeSerialize(streamBytes); account = Encoding.UTF8.GetString(package.Account); business.CleaningStart(new ZhaopinCleaningProcedure { Id = package.CleaningId, Account = Encoding.UTF8.GetString(package.Account), Password = Encoding.UTF8.GetString(package.Password) }); cleaningDictionary.AddOrUpdate(Encoding.UTF8.GetString(package.Account), k => socket, (k, v) => socket); continue; } if (actionId == 0x05) { var package = new CheckCodePackage().DeSerialize(streamBytes); business.InserCheckCode(new ZhaopinCheckCode { Account = Encoding.UTF8.GetString(package.Account), Cookie = Encoding.UTF8.GetString(package.Cookie), CreateTime = DateTime.Now, Status = 0, Type = package.Type }); } if (actionId == 0x09) { var package = new CheckCoordinatPackage().DeSerialize(streamBytes); Socket socketClient; if (!cleaningDictionary.TryGetValue(Encoding.UTF8.GetString(package.Account), out socketClient)) { continue; } socketClient.Send(streamBytes); } if (actionId == 0x0a) { var package = new ReferenceCheckCodePackage().DeSerialize(streamBytes); Socket socketClient; if (!cleaningDictionary.TryGetValue(Encoding.UTF8.GetString(package.Account), out socketClient)) { continue; } socketClient.Send(streamBytes); } //if (actionId == 0x0c) //{ // var package = new LoginCheckResultPackage().DeSerialize(streamBytes); // business.LoginCheckResult(package.CheckCodeId, package.Status, package.CleaningId); // Socket socketClient; // if (!clientDictionary.TryGetValue(package.CheckCodeId, out socketClient)) continue; // socketClient.Send(streamBytes); // if (package.Status == 1) // { // clientDictionary.TryRemove(package.CheckCodeId, out socketClient); // } //} } } } }); } }
private void ListenerServer() { var bytes = new byte[1024]; while (true) { if (this.socket.Available == 0) { Thread.Sleep(100); continue; } socket.Receive(bytes, 0, 3, SocketFlags.None); var socketId = bytes[0]; var length = (short)(bytes[1] << 8 | bytes[2]); using (var stream = new MemoryStream()) { stream.Write(bytes, 0, 3); for (var i = 3; i < length; i += bytes.Length) { var readLength = length - i > bytes.Length ? bytes.Length : length - i; var len = 0; while (len != readLength) { len += socket.Receive(bytes, len, readLength - len, SocketFlags.None); } stream.Write(bytes, 0, readLength); } var streamBytes = stream.ToArray(); if (socketId == 0x03) { var package = new CheckedResultPackage().DeSerialize(streamBytes); if (package.Status == 1) { checkResult = true; } continue; } if (socketId == 0x07) { isStop = true; continue; } if (socketId == 0x08) { isStop = false; } } } }