using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; /// 添加核心组件引用 using WrlEngine; using WrlBase; namespace PluginExeDemo { public partial class Form1 : Form { /// /// web socket服务对象 /// SocketProxyClass WebSocketServer = null; /// /// web socket服务事件对象 /// WebSocketEventSink WebSocketEvent = null; /// /// 命令行启动参数 /// Dictionary m_Para; public Form1(string strPara) { InitializeComponent(); m_Para = new Dictionary(); /// 解析命令行参数 string[] cmdArray = strPara.Split('&'); foreach (string cmd in cmdArray) { string[] paraArray = cmd.Split('='); foreach (string para in paraArray) { m_Para.Add(paraArray[0], paraArray[1]); break; } } } public void Send(string strSID,string strContent) { WebSocketServer.AsynSendText(strSID,strContent); } public void OpenUrl(string strUrl) { this.IEBrowser.Navigate(strUrl); } private void Form1_Load(object sender, EventArgs e) { WebSocketServer = new SocketProxyClass(); if (null == WebSocketServer) return; WebSocketEvent = new WebSocketEventSink(); if (null == WebSocketEvent) return; WebSocketEvent.SetForm(this); ushort nPort = ushort.Parse(m_Para["PORT"]); /// 开始WebSocket侦听服务,返回实际侦听端口 ushort nListenPort = WebSocketServer.Listen(nPort, m_Para["SID"], m_Para["AI"]); /// 建立事件通知 WebSocketServer.NewConnEvent += WebSocketEvent.NewConnEvent; WebSocketServer.RecMsgEvent += WebSocketEvent.RecMsgEvent; WebSocketServer.RecTextEvent += WebSocketEvent.RecTextEvent; WebSocketServer.ConnCloseEvent += WebSocketEvent.ConnCloseEvent; } private void Form1_Closed(object sender, EventArgs e) { /// 移除事件通知 WebSocketServer.NewConnEvent -= WebSocketEvent.NewConnEvent; WebSocketServer.RecMsgEvent -= WebSocketEvent.RecMsgEvent; WebSocketServer.RecTextEvent -= WebSocketEvent.RecTextEvent; WebSocketServer.ConnCloseEvent -= WebSocketEvent.ConnCloseEvent; /// 释放对象 if (null != WebSocketServer) { WebSocketServer.Close(); WebSocketServer = null; } WebSocketServer = null; } private void button1_Click(object sender, EventArgs e) { string strLastSID = WebSocketEvent.GetLastSID(); if (null == strLastSID || 0 == strLastSID.Length) { MessageBox.Show("还未有来自网页的连接!"); return; } Send(strLastSID,this.textBox1.Text); this.textBox1.Text = ""; } /// /// WebSocket服务事件通知 /// public class WebSocketEventSink : _ISocketProxyEvents { /// /// 主窗口 /// Form1 m_Form; string m_strLastSID; public void SetForm(Form1 Form) { m_Form = Form; } public string GetLastSID() { return m_strLastSID; } public void WriteLog(string documentName, string msg) { string LogFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data"); if (!System.IO.Directory.Exists(LogFilePath)) System.IO.Directory.CreateDirectory(LogFilePath); string logFile = System.IO.Path.Combine(LogFilePath, documentName + "@" + DateTime.Today.ToString("yyyy-MM-dd") + ".txt"); bool writeBaseInfo = System.IO.File.Exists(logFile); StreamWriter swLogFile = new StreamWriter(logFile, true, Encoding.Unicode); swLogFile.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "\t" + msg); swLogFile.Close(); swLogFile.Dispose(); } /// /// 通知收到新连接 /// /// public void NewConnEvent(string bstrSID) { m_strLastSID = bstrSID; m_Form.textBox2.AppendText("收到新连接:"); m_Form.textBox2.AppendText(bstrSID); m_Form.textBox2.AppendText("\r\n"); } /// /// 通知连接收到JSON数据包 /// /// /// /// /// public void RecMsgEvent(string bstrSID, uint nReqID, string bstrPushName, string bstrMsg) { m_Form.textBox2.AppendText("收到新数据包,请求序号:"); m_Form.textBox2.AppendText(nReqID.ToString()); m_Form.textBox2.AppendText("协议名:"); m_Form.textBox2.AppendText(bstrPushName); m_Form.textBox2.AppendText("内容:"); m_Form.textBox2.AppendText(bstrMsg); m_Form.textBox2.AppendText("\r\n"); if (bstrPushName == "Demo_OpenUrl") { /// 获得打开URL地址,调用浏览器打开 JsonServiceClass JsonService = new JsonServiceClass(); JsonService.ParseString(bstrMsg); string strUrl = JsonService.GetStringValue("url"); JsonService = null; m_Form.OpenUrl(strUrl); return; } /// 回传给网页内容 m_Form.Send(bstrSID,"收到请求" + bstrPushName); } /// /// 通知连接收到文本内容 /// /// /// public void RecTextEvent(string bstrSID, string bstrText) { m_Form.textBox2.AppendText("收到文本内容:"); m_Form.textBox2.AppendText(bstrText); m_Form.textBox2.AppendText("\r\n"); /// 回传给网页内容 m_Form.Send(bstrSID,"收到文本内容" + bstrText); } /// /// 通知连接收到字节流内容 /// /// /// /// public void RecByteEvent(string bstrSID, Object Content, uint nLen) { m_Form.textBox2.AppendText("收到二进制流:"); m_Form.textBox2.AppendText(Content.ToString()); m_Form.textBox2.AppendText("\r\n"); } /// /// 通知HTTP同步请求处理 /// /// /// /// /// /// public void HttpReqEvent(string bstrSID, string bstrProtocol, string bstrUrl, string bstrPara, out string pVal) { /// 收到HTTP协议请求,主要用于前端同步请求,比如前端需要等待请求完成浏览器才能继续操作 /// 这里执行阻塞操作,比如弹出模态对话框 pVal = "{\"ret\":0,\"data\":{\"Ret\":0,\"Code\":1}}"; } /// /// 通知HTTP侦听端口 /// /// public void HttpPortEvent(ushort nPort) { m_Form.textBox2.AppendText("HTTP侦听端口:"); m_Form.textBox2.AppendText(nPort.ToString()); m_Form.textBox2.AppendText("\r\n"); } /// /// WS连接请求中出现错误 /// /// /// /// public void RecErrEvent(string bstrSID, uint nReqID, string bstrErrInfo) { m_Form.textBox2.AppendText("连接出现错误:"); m_Form.textBox2.AppendText(bstrErrInfo); m_Form.textBox2.AppendText("\r\n"); } /// /// 通知关闭连接 /// /// /// public void ConnCloseEvent(string bstrSID, string bstrReason) { m_Form.textBox2.AppendText("关闭连接:"); m_Form.textBox2.AppendText(bstrReason); m_Form.textBox2.AppendText("\r\n"); } } } }