监听指定端口数据交互(HttpListenerContext )
很怀念以前做机票的日子,,,,可惜回不去
以前的项目中的,拿来贴贴
场景:同步第三方数据,监听指定地址(指定时间间隔,否则不满足,因为需要处理粘包问题,改篇未实现)
主要内容四个文件;下面分别说下每个文件的功能。
1.HttpRequestManager.cs顾名思义,HttpRequest
public class HttpRequestManager
{
int _sDefaultLen = ; 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 = ;
int sIndex = ; while ((sIndex = stream.Read(buffer, sLen, )) != )
sLen += sIndex; if (sLen < )
{
//反馈给第三方,并记录本地日志
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 = ;
//解析入库方法
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, , buf);
} public static bool SendResponse(HttpListenerContext ctx, byte[] buf)
{
return SendResponse(ctx, , 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, , 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 > )
{
_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();
} }
监听指定端口数据交互(HttpListenerContext )的更多相关文章
- linux: 获取监听指定端口的进程PID
在 linux 下经常需要杀死(重启)监听某端口的进程, 因此就写了一个小脚本, 通过 ss 命令获取监听制定端口的进程 PID, 然后通过 kill 命令结束掉进程: #!/bin/sh # set ...
- 剥开比原看代码03:比原是如何监听p2p端口的
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchai ...
- Oracle 11g RAC 环境下单实例非缺省监听及端口配置
如果在Oracle 11g RAC环境下使用dbca创建单实例数据库后,Oracle会自动将其注册到缺省的1521端口及监听器.大多数情况下我们使用的为非缺省监听器以及非缺省的监听端口.而且在Orac ...
- .Net客户端监听ZooKeeper节点数据变化
一个很简单的例子,用途是监听zookeeper中某个节点数据的变化,具体请参见代码中的注释 using System; using System.Collections.Generic; using ...
- Android 监听ContentProvider的数据改变
今天介绍一下怎么监听ContentProvider的数据改变,主要的方法是:getContext().getContentResolver().notifyChange(uri,null),这行代码是 ...
- 普通用户从非80端口启动tomcat,通过端口转发监听80端口
linux下小于1024的端口都需要root去绑定. root权限启动tomcat是不明智的,可以使用非root权限启动tomcat监听8080端口,然后利用端口转发实现对80端口的监听. 端口转发: ...
- 【网络通信】服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么?
1. 服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么? 答:对.建立连接时服务器会分配一个新的Socket,但是用的源端口号还是80端口.套接字是由协议类型.源IP.目的IP ...
- Tomcat监听443端口的方法
当我们需要更安全的访问网站的时候就会选择使用https协议,而https协议默认的端口号为443端口,这就是我们为什么向让Tomcat监听在443端口的原因,因为监控在非80端口和443端口的web服 ...
- 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志
6月27日任务 16.4 配置Tomcat监听80端口16.5/16.6/16.7 配置Tomcat虚拟主机16.8 Tomcat日志扩展邱李的tomcat文档 https://www.linuser ...
随机推荐
- ckeditor与ckfinder简单整合使用
Ckeditor与ckfinder简单整合使用 功能:主要用来发送图文的email,图片上传到本地服务器,但是email的图片地址要写上该服务器的远程地址(图片地址:例如:http://www.bai ...
- Linux Shell编程(11)——退出和退出状态
exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程.每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零值 ...
- Delphi 6 Web Services初步评估
Delphi 6 Web Services初步评估这是我刚到现在公司的时候(2001年8月份)所作的一份测试报告,现公布出来,希望能对大家有所帮助.因为当时d6刚刚发行,Web Service方面还存 ...
- Linux学习笔记4——函数调用栈空间的分配与释放
一.函数执行时使用栈空间作为自己的临时栈,3种方式决定编译器清空栈的方式:__stdcall. __fastcall.__cdecl 1.__stdcall表示每个调用者负责清空自己调用的函数的临时栈 ...
- oracle中多表查询优化笔记
ORACLE有个高速缓冲的概念,这个高速缓冲呢就是存放执行过的SQL语句,对应已经执行过的sql语句,第二次执行的时候速度会比第一次块,用的就是高速缓冲.ORACLE的高速缓冲是全字符匹配的,如果sq ...
- CSS3 概览 更新时间 2014-0412-1317
CSS3 概览 CSS3可以划分为:文字.边框模型.背景.动画等. CSS3颜色模块 CSS2.1的时候可以使用4种颜色方式,直接使用颜色名,如 redRGB值,如 rgb(0,90,255)RGB百 ...
- ACM1019_最大公倍数
/*问题说明 一组正整数的最小公倍数(LCM)是最小的正整数约数集合中的所有号码. 例如,5,7和15的最小公倍数是105. 输入 输入将包括多个问题的实例.输入的第一行中,将包含一个整数, 表示问题 ...
- centos 6安装报错
Missing ISO image The installer has tried to . but cannot find it on the hard drive. Please copy thi ...
- openStack云平台虚拟桌面galera mysql 3节点集群实例实战 调试完成
被复制节点: /usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=gcomm:// >/dev/null &复制节点01: ...
- hdoj 3635 Dragon Balls【并查集求节点转移次数+节点数+某点根节点】
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...