监听指定端口数据交互(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 ...
随机推荐
- 介绍一个好用的软件--多个WIN远程连接
MultiDesk v3.162015-03-16 http://www.syvik.com/multidesk/index_chs.htm MultiDesk 是一个选项卡(TAB标签)方式的远程桌 ...
- Netty实现服务端客户端长连接通讯及心跳检测
通过netty实现服务端与客户端的长连接通讯,及心跳检测. 基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每 ...
- lc面试准备:Candy
1 题目 There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- SQL*Net more data to client
The server process is sending more data/messages to the client. The previous operation to the client ...
- 【HDOJ】1429 胜利大逃亡(续)
BFS+状态压缩,做了很多状态压缩了.今晚把八数码问题给搞定了. #include <iostream> #include <queue> #include <cstri ...
- Linux Shell编程(14)——内部变量
内建变量影响Bash脚本行为的变量.$BASHBash二进制程序文件的路径 bash$ echo $BASH /bin/bash$BASH_ENV该环境变量保存一个Bash启动文件路径,当启动一个脚本 ...
- ANT的下载和安装
下载 下载页面:http://ant.apache.org/bindownload.cgi 安装 撰写本文的时候,最新的ANT版本是1.9.7,它是绿色软件,解压缩得到apache-ant-1.9.7 ...
- NDK的安装和下载
从官网下载NDK 下载页面:https://developer.android.com/ndk/downloads/index.html 从镜像站点下载NDK "大师兄"是一个由腾 ...
- 《Linear Algebra and Its Applications》-chaper4-向量空间-子空间、零空间、列空间
在线性代数中一个非常重要的概念就是向量空间R^n,这一章节将主要讨论向量空间的一系列性质. 一个向量空间是一些向量元素构成的非空集合V,需要满足如下公理: 向量空间V的子空间H需要满足如下三个条件: ...
- 从物理执行的角度透视spark Job
本博文主要内容: 1.再次思考pipeline 2.窄依赖物理执行内幕 3.宽依赖物理执行内幕 4.Job提交流程 一:再次思考pipeline 即使采用pipeline的方式,函数f对依赖的RDD中 ...