打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
监听指定端口数据交互(HttpListenerContext )

很怀念以前做机票的日子,,,,可惜回不去

以前的项目中的,拿来贴贴

场景:同步第三方数据,监听指定地址(指定时间间隔,否则不满足,因为需要处理粘包问题,改篇未实现)

主要内容四个文件;下面分别说下每个文件的功能。

1.HttpRequestManager.cs顾名思义,HttpRequest

public class HttpRequestManager { int _sDefaultLen = 102400; public virtual void OnHttpRequest(object context) { HttpListenerContext hltc = context as HttpListenerContext; if (hltc.Request.QueryString['cmd'] == null) { try { //反馈给第三方平台 无CMD关键字 ReSendMsgService.SendResponse(hltc, '无CMD关键字'); } catch (Exception ex) { MyLog.WriteLog('时间:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + '返回给第三方无CMD关键字失败' + ex.Message); } //记录本地日志 MyLog.WriteLog('对象:OnHttpRequest:无CMD关键字,请联系第三方平台'); return; } string sCmd = hltc.Request.QueryString['cmd'].ToUpper(); switch (sCmd) { case 'SUBMITPOLICY': //指定接收方法 MyLog.WriteLog('对象:指令通过,当前指令为SUBMITPOLICY'); OnReceivPolisy(hltc); break; default: //反馈第三方平台,并记录本地日志 ,cmd指令错误 您的请求不被识别 try { ReSendMsgService.SendResponse(hltc, 'PifRecvAgent 您的请求不被识别,' + sCmd); } catch (Exception ex) { MyLog.WriteLog('时间:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + '返回给第三方PifRecvAgent 您的请求不被识别失败' + ex.Message); } MyLog.WriteLog('对象:OnHttpRequest: 第三方平台的请求不被识别'); break; } } //接收,解析方法 void OnReceivPolisy(HttpListenerContext hltc) { byte[] buffer = new byte[_sDefaultLen]; Stream stream = hltc.Request.InputStream; int sLen = 0; int sIndex = 0; while ((sIndex = stream.Read(buffer, sLen, 512)) != 0) sLen += sIndex; if (sLen < 1) { //反馈给第三方,并记录本地日志 try { ReSendMsgService.SendResponse(hltc, 'Post的数据为空.'); } catch (Exception ex) { GLOBAL.MyLog.WriteLog('时间:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + '返回给第三方Post的数据为空失败' + ex.Message); } MyLog.WriteLog('对象:OnReceivPolisy: Post的数据为空.'); } //解析、入库 bool jxbl = RelePolicyBuffer(buffer, buffer.Length); if (!jxbl)//XML解析失败 { try { //发送指令给第三方 ReSendMsgService.SendResponse(hltc, 'XML结构解析失败'); } catch (Exception ex) { MyLog.WriteLog('时间:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + '返回给第三方XML结构解析失败失败' + ex.Message); } } //否则发送0给第三方 try { ReSendMsgService.SendResponse(hltc, new byte[] { 0x30 }); } catch (Exception ex) { MyLog.WriteLog('时间:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + '返回给第三方 0 失败' + ex.Message); } } int r = 1; //解析入库方法 bool RelePolicyBuffer(byte[] buffer, int bLen) { //此处为解析xml的脚本,省略,,,,,,,xmltextreader方式解析,单向只读 } }}

2.ReSendMessage.cs实现(接受结果之后给第三方返回接受结果信息)

/// <summary>    /// /将响应结果反馈第三方,否则第三方默认失败,如此将延迟发送时间    /// </summary>    public class ReSendMsgService    {        #region SendResponse 给请求发发送应答        public static bool SendResponse(HttpListenerContext ctx, string sErr)        {            byte[] buf = Encoding.Default.GetBytes(sErr);            return SendResponse(ctx, 200, buf);        }        public static bool SendResponse(HttpListenerContext ctx, byte[] buf)        {            return SendResponse(ctx, 200, buf);        }        public static bool SendResponse(HttpListenerContext ctx, int nStatusCode, byte[] buf)        {            try            {                ctx.Response.StatusCode = nStatusCode;                ctx.Response.ContentLength64 = buf.Length;                ctx.Response.OutputStream.Write(buf, 0, buf.Length);                return true;            }            catch (Exception ex)            {            }            return false;        }        #endregion    }

3.ThreadEntrustManager.cs类,用于监听器的初始化,见代码

/// <summary> /// 委托方法类 /// </summary> public class ThreadEntrustManager { protected HttpListener _listener; Thread _ListenerThread; bool _bThreadLoop; string url; static string _ListenerUrls = XmlHelp.GetXmlNode('LocalListenUrl').InnerText; string[] _ListenerUrlsArray = _ListenerUrls.Split(';'); public void ListenerStart() { if (_ListenerUrlsArray.Length > 0) { _listener = new HttpListener(); _bThreadLoop = true; foreach (string strUrl in _ListenerUrlsArray) { url = strUrl; _listener.Prefixes.Add(url);//添加监听前缀对象 } _listener.Start(); MyLog.WriteLog('时间:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + ' start listening...'); _ListenerThread = new Thread(new ThreadStart(ThreadFunction)); _ListenerThread.Start(); } else { _bThreadLoop = false; //日志 } } void ThreadFunction() { while (_bThreadLoop) { try { HttpListenerContext hltc = _listener.GetContext(); ThreadPool.QueueUserWorkItem(new HttpRequestManager().OnHttpRequest, hltc); //线程池委托接收对象 } catch (Exception ex) { GLOBAL.MyLog.WriteLog(ex); Trace.Fail('对象:ThreadFunction :An error occured in database access, details: ' + ex.Message); } } } public void ListenerClose() { _ListenerThread.Abort(); _bThreadLoop = false; _listener.Close(); } }

4.MainManager.cs主方法,程序启动时初始化调用

/// <summary>    /// 主函数方法类    /// </summary>    public class MainManager    {        /// <summary>        /// 主方法 开始是方法        /// </summary>        public static void MainStart()        {            try            {                _ListenerStart();            }            catch (Exception ex)            {               //记录异常日志信息            }        }        public static void _ListenerStart()        {            ThreadEntrustManager manager = new ThreadEntrustManager();            manager.ListenerStart();        }        public static void Close()        {           new ThreadEntrustManager().ListenerClose();        }    }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Windows和Linux上通用的日志类MyLog
贴耳穴治疗原发性痛经91例疗效观察
在ubuntu20.4下安装ardupilot4.3.6
nginx源码分析
python学习之第三方包安装方法(两种方法)
gin+grpc+etcd 重构 grpc-todolist 项目
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服