public void Send(WebSocketNode node) { for (int i = 0; i < socketlist.Count; i++) { socketlist[i].Send((int)node.OPCode, node.Message); } }
private void Listen() { ThreadPool.QueueUserWorkItem(_ => { try { while (true) { byte opcode = (byte)0; String2 head = Receive(2); if (head.Length < 2) { throw new Exception("header size"); } bool fin = (head[0] & 0x80) == 0x80; if (!fin) { throw new Exception("Fin error"); } opcode = (byte)(head[0] & 0x0f); bool mask = (head[1] & 0x80) == 0x80; int length = head[1] & 0x7F; if (length == 0x7E) { length = BitConverter.ToInt16(Reverse(Receive(2).ToBytes()), 0); } if (length == 0x7F) { length = (int)BitConverter.ToInt64(Reverse(Receive(8).ToBytes()), 0); } String2 key = mask ? Receive(4) : null; if (opcode == (int)Opcode.MESSAGE) { byte[] buffer = Receive(length).ToBytes(); if (key != null) { for (int i = 0; i < buffer.Length; i++) { buffer[i] = (byte)(buffer[i] ^ key[i % 4]); } } if (this._method != null) { WebSocketNode node = this._method(buffer); if (node.IsBroadCast) { _server.Send((int)node.OPCode, node.Message); } else { Send((int)node.OPCode, node.Message); } } continue; } if (opcode == (int)Opcode.BINARY) { byte[] buffer = Receive(length).ToBytes(); if (key != null) { for (int i = 0; i < buffer.Length; i++) { buffer[i] = (byte)(buffer[i] ^ key[i % 4]); } } if (this._method != null) { WebSocketNode node = this._method(buffer); if (node.IsBroadCast) { _server.Send((int)node.OPCode, node.Message); } else { Send((int)node.OPCode, node.Message); } } continue; } if (opcode == (int)Opcode.EXIT) { return; } if ((opcode == (int)Opcode.PING) || (opcode == (int)Opcode.PONG)) { Send(opcode, null); continue; } throw new Exception("This opcode is wrong. Receive OPCODE - " + opcode); } } catch (Exception e) { Console.WriteLine(e); _socket.Close(); _server.RemoveWebSocket(this); } }); }
public void SendWebSocket(WebSocketNode node) { Send(node); }
public void InitializeFlow() { server = ServerFactory.NewInstance(ServerInfo.GetPort()); server.SetRootPath(ServerInfo.GetWebRoot()); server.Set("/ControllView", (req, res) => { res.SetHeader("Content-Type", "text/html; charset=utf-8"); res.ReadFile(ServerInfo.GetWebRoot() + "\\index.html"); }); server.Set("/Jquery", (req, res) => { res.SetHeader("Content-Type", "text/javascript; charset=UTF-8"); res.ReadFile(ServerInfo.GetWebRoot() + "\\jquery-3.2.1.min.js"); }); server.Set("/Css", (req, res) => { res.SetHeader("Content-Type", "text/css;"); res.ReadFile(ServerInfo.GetWebRoot() + "\\common.css"); }); server.Set("/Javascript", (req, res) => { res.SetHeader("Content-Type", "text/css;"); res.ReadFile(ServerInfo.GetWebRoot() + "\\common.js"); }); server.Set("/Ping", (req, res) => { if (req.QueryString.ContainsKey("Code")) { String code = req.QueryString["Code"].ToString(); if (scraperlist.ContainsKey(code)) { scraperlist[code].Parameter.Pingtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); server.SendWebSocket(new WebSocketNode() { OPCode = Opcode.MESSAGE, Broadcast = true, Message = JsonConvert.SerializeObject(new SocketNode() { key = "ping", data = JsonConvert.SerializeObject(scraperlist[code].Parameter) }) }); } } }); server.Set("/Scrap", (req, res) => { if (!req.QueryString.ContainsKey("Code")) { res.SetResponseCode(400, "Bad Request"); return; } if (!req.QueryString.ContainsKey("Id")) { res.SetResponseCode(400, "Bad Request"); return; } if (!req.QueryString.ContainsKey("Pw")) { res.SetResponseCode(400, "Bad Request"); return; } String param = "Code=" + req.QueryString["Code"].ToString() + "&Id=" + req.QueryString["Id"].ToString() + "&Pw=" + req.QueryString["Pw"].ToString(); this.logger.Info("Start scraper param : " + param); Scraper scraper = new Scraper(param); String key = scraper.Run(); scraperlist.Add(key, scraper); server.SendWebSocket(new WebSocketNode() { OPCode = Opcode.MESSAGE, Broadcast = true, Message = JsonConvert.SerializeObject(new SocketNode() { key = "insert", data = JsonConvert.SerializeObject(scraper.Parameter) }) }); res.StateOK(); }); server.Set("/EndScrap", (req, res) => { if (!req.QueryString.ContainsKey("Code")) { res.SetResponseCode(400, "Bad Request"); return; } this.logger.Info("EndScrap"); String code = req.QueryString["Code"].ToString(); if (!scraperlist.ContainsKey(code)) { res.SetResponseCode(400, "Bad Request"); return; } this.logger.Debug("Exit Code = " + code); server.SendWebSocket(new WebSocketNode() { OPCode = Opcode.MESSAGE, Broadcast = true, Message = JsonConvert.SerializeObject(new SocketNode() { key = "remove", data = JsonConvert.SerializeObject(scraperlist[code].Parameter) }) }); scraperlist.Remove(code); res.StateOK(); return; }); server.Set("/AbortScrap", (req, res) => { if (!req.QueryString.ContainsKey("Code")) { res.SetResponseCode(400, "Bad Request"); return; } this.logger.Info("EndScrap"); String code = req.QueryString["Code"].ToString(); if (!scraperlist.ContainsKey(code)) { res.SetResponseCode(400, "Bad Request"); return; } this.logger.Debug("Exit Code = " + code); scraperlist[code].Kill(); server.SendWebSocket(new WebSocketNode() { OPCode = Opcode.MESSAGE, Broadcast = true, Message = JsonConvert.SerializeObject(new SocketNode() { key = "remove", data = JsonConvert.SerializeObject(scraperlist[code].Parameter) }) }); scraperlist.Remove(code); res.StateOK(); }); server.Set("/RestartScrap", (req, res) => { if (!req.QueryString.ContainsKey("Code")) { res.SetResponseCode(400, "Bad Request"); return; } this.logger.Info("RestartScrap"); String code = req.QueryString["Code"].ToString(); if (!scraperlist.ContainsKey(code)) { res.SetResponseCode(400, "Bad Request"); return; } scraperlist[code].Kill(); String param = "Code=" + scraperlist[code].Parameter.Code + "&Id=" + scraperlist[code].Parameter.Id + "&Pw=" + scraperlist[code].Parameter.Pw; Scraper scraper = new Scraper(param); scraperlist[code] = scraper; scraper.Run(code, false); server.SendWebSocket(new WebSocketNode() { OPCode = Opcode.MESSAGE, Broadcast = true, Message = JsonConvert.SerializeObject(new SocketNode() { key = "restart", data = JsonConvert.SerializeObject(scraperlist[code].Parameter) }) }); res.StateOK(); }); IDictionary <String, Action <String, WebSocketNode> > socketmethod = new Dictionary <String, Action <String, WebSocketNode> >(); socketmethod.Add("init", (data, node) => { logger.Debug("init"); //scraperlist; List <Object> ret = new List <object>(); foreach (var s in scraperlist) { ret.Add(s.Value.Parameter); } SocketNode message = new SocketNode() { key = "init", data = JsonConvert.SerializeObject(ret) }; node.OPCode = Opcode.MESSAGE; node.Message = JsonConvert.SerializeObject(message); node.Broadcast = false; }); socketmethod.Add("log", (data, node) => { logger.Debug("log"); node.OPCode = Opcode.MESSAGE; logger.Info(data); }); socketmethod.Add("start", (data, node) => { StartScraper(data); }); server.SetWebSocket((data, opcode) => { WebSocketNode ret = new WebSocketNode() { OPCode = Opcode.MESSAGE }; String message = data.ToString(); try { SocketNode node = JsonConvert.DeserializeObject <SocketNode>(message); if (!socketmethod.ContainsKey(node.key)) { throw new Exception("not method"); } socketmethod[node.key](node.data, ret); } catch (Exception e) { logger.Error(e.ToString()); ret.Broadcast = false; ret.Message = JsonConvert.SerializeObject(new SocketNode() { key = "error" }); } return(ret); }); }