监听指定端口数据交互(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 ...
随机推荐
- Delphi在win7/vista下写注册表等需要管理员权限的解决方案
看到论坛好多人问win7下写注册表的问题,我结合自己的理解写了一点东西,首先声明一下,本人初学Delphi,水平有限,大家见笑了,有什么不对之处请老鸟多指点. [背景]win7/Vista提供的UAC ...
- semijoin链接进行subquery unnesting.
drop table emp1; drop table dept1; create table emp1 as select * from emp; create table dept1 as sel ...
- 【转】微信Android SDK示例代码及运行方法
原文网址:http://blog.csdn.net/icyfox_bupt/article/details/23742217 最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一 ...
- CXF Service Interceptor请求,响应报文之控制台输出
一:定义接口 @WebService(targetNamespace = "http://www.unionpay.com/client/appprovider", name = ...
- XML文档部署到Tomcat服务器上总是加载出错
config.xnl 起初文档路径是在src/Dao/config.xml 在Dao目录下BaseDao类中,解析config.xml文件路径 path="/Dao/config.xml&q ...
- ubuntu制作usb启动盘
准备: u盘 iso镜像文件--ubuntu-12.04.2-desktop-amd64.iso 烧盘软件--unetbootin-linux-583 步骤: 格式化u盘 查看u盘信息 #mount/ ...
- N2N 对等VPN网络
n2n是一个二层的虚拟专网,允许用户开发网络中典型的P2P应用而不是在应用层开发.这就意味着用户可以透明的得到本地地址,只要新的IP地址在一个子网内,无论两台机器处于什么位置都能够ping通对方. N ...
- Subversion/Git/ReviewBoard工作流程
根据My (work)Git Workflow进行修改,在 Windows下进行测试,http://mojodna.net/2009/02/24/my-work-git-workflow.html 目 ...
- [置顶] MyEclipse下安装插件方法(properties文件编辑器Propedit为例)
网上流传了很多安装插件的方法.在这里我只讲解一种方法. 因为我认为这种方法有以下两个优点:第一.简单,方便安装:第二.对于自己安装的插件易于管理. 我的myeclipse版本号为10.5,操作系统为w ...
- HDU 3078 Network LCA
题意:n个点 m个询问,下面一行是n 个点的权值 再下面n-1行是双向的边 然后m个询问:k u v 若k==0,则把u点的权值改为v,否则回答u->v之间最短路经过点的权值中 第k大的值是多 ...