摘自《Asp.Net 本质论》作者:郝冠军

/*
为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListerer类,使用它,在构造函数中传递一组网络端点信息就可以准备好监听参数,而不再需要设置使用的网络协议等细节,调用Start方法之后,监听工作开始。AcceptTcpClient方法将阻塞进程,知道一个客户端的连接到达监听器,这个方法将返回一个代表客户端连接的代理对象
*/

 class TcpListener_Study
{
public void CreateTcpLister()
{
//获得本机的loopback网络地址,即127.0.0.1
IPAddress address = IPAddress.Loopback;
//创建可以访问的端点,8974 为0表示一个空闲的端口号
IPEndPoint endpoint = new IPEndPoint(address, ); TcpListener newserver = new TcpListener(endpoint);
newserver.Start();
Console.WriteLine("开始监听,端口号:{0}", endpoint.Port);
while (true)
{
//等待客户端连接
TcpClient newclient = newserver.AcceptTcpClient();
Console.WriteLine("已建立连接");
//得到一个网络流
NetworkStream ns = newclient.GetStream(); //准被读取客户端请求的数据,读取的数据放在一个数组中
byte[] request = new byte[]; int lentth = ns.Read(request, , ); string requeststring = Encoding.UTF8.GetString(request, , lentth); Console.WriteLine(requeststring); //回应状态行
string statusLine = "Http/1.1 200 ok \r\n";
byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine);
//准备发送到客户端的网页
string responseBody = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head runat=\"server\"> <title>Socket Study </title></head><body><form id=\"form1\" runat=\"server\"><div>Hello World ,Socket Study </div> </form></body></html>";
byte[] responseBytes = Encoding.UTF8.GetBytes(responseBody);
string responseHeader = string.Format("Content-type:text/html; charset=UTF-8 \r\nContent-length:{0}\r\n", responseBody.Length);
byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
//向客户端发送状态信息
ns.Write(statusLineBytes, , statusLineBytes.Length);
//发送回应头
ns.Write(responseHeaderBytes, , statusLineBytes.Length); ns.Write(new byte[] { , },,);
//发送内容
ns.Write(responseBytes, , statusLineBytes.Length);
newclient.Close();
if (Console.KeyAvailable)
{
break;
}
newserver.Stop();
}
}
}

/*
为了进一步简化http协议的监听器,.Net在命名空间System.Net中提供了HttpListener类,伴随这个对象,.NET提供了一系列相关
* 对象封装了HTTP的处理工作。
*
*/

 class HttpLisener_Study
{
public void CreateHTTPLister()
{
if (!HttpListener.IsSupported)
{
throw new System.InvalidOperationException("系统必须为xp sp2 server03 以上版本");
}
string[] prefixes = new string[] { "http://localhost:8974/" }; HttpListener listener = new HttpListener();
foreach (string s in prefixes)
{ listener.Prefixes.Add(s);
}
listener.Start();
Console.WriteLine("监听中");
while (true)
{
//阻塞线程,直到请求到达
HttpListenerContext context = listener.GetContext();
Console.WriteLine("已建立连接"); HttpListenerRequest request = context.Request;
Console.WriteLine("{0}{1} http/1.1", request.HttpMethod, request.RawUrl);
Console.WriteLine("Accept:{0}", string.Join(",", request.AcceptTypes));
Console.WriteLine("Accept-language:{0}",string.Join(",",request.UserLanguages)); Console.WriteLine("User-Agent:{0}", string.Join(",", request.UserAgent)); Console.WriteLine("Accept-Encoding:{0}", string.Join(",", request.Headers["Accept-Encoding"])); Console.WriteLine("Connection:{0}", request.KeepAlive ? "Keep-Alive" : "close"); Console.WriteLine("Host:{0}", request.UserHostName);
Console.WriteLine("Pragma:{0}", request.Headers["Pragma"]); //取得回应对象
HttpListenerResponse response = context.Response;
string responseString = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head runat=\"server\"> <title>Socket Study </title></head><body><form id=\"form1\" runat=\"server\"><div>Hello World ,Socket Study </div> </form></body></html>";
response.ContentLength64 = Encoding.UTF8.GetByteCount(responseString);
response.ContentType = "text/html;charset=UTF-8";
//输出回应内容
System.IO.Stream output = response.OutputStream;
System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
writer.Write(responseString);
writer.Close();
if (Console.KeyAvailable)
{
break;
} listener.Stop();
}
}
}

基于TcpListerer的web服务器 和 基于HttpListerer的web服务器的更多相关文章

  1. 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能

    文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...

  2. PHP写的异步高并发服务器,基于libevent

    PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ  本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...

  3. ASP.NET Web Api构建基于REST风格的服务实战系列教程

    使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[十]——使用CacheCow和ETag缓存资源 系列导航地址http://www.cnblogs.com/fzrain/p/3 ...

  4. ASP.NET WEB API构建基于REST风格

    使用ASP.NET WEB API构建基于REST风格的服务实战系列教程[开篇] 最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http ...

  5. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  6. WebApplicationInitializer究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用

    本文转自http://hitmit1314.iteye.com/blog/1315816 大家应该都已经知道Spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spri ...

  7. Web Service 实例基于Socket创建Web服务

    ServerSocket服务器端代码如下: public static void main(String[] args) throws IOException { // 1:建立服务器端的tcp so ...

  8. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

  9. 基于gSOAP使用头文件的C语言版web service开发过程例子

    基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...

  10. 基于Token的身份认证 与 基于服务器的身份认证

    基于Token的身份认证 与 基于服务器的身份认证 基于服务器的身份认证 在讨论基于Token的身份认证是如何工作的以及它的好处之前,我们先来看一下以前我们是怎么做的: HTTP协议是无状态的,也就是 ...

随机推荐

  1. 【Selenium2】【问题】

    [iframe 和 HTML 相互嵌套] 比如126登录页,我的几个方法都不好用 1. iframeFather = driver.find_element(By.XPATH,"//div[ ...

  2. Intellij idea创建maven项目并配置tomcat

    今天刷知乎的时候刷到这么一句话 我觉得还是蛮有趣的,形容的也比较到位,正好最近新建maven项目进行了thrift数据的传输,在此做一个记录 首先idea整合了maven,不需要单独下载 新建一个Pr ...

  3. 《剑指offer》第五十八题(左旋转字符串)

    // 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcde ...

  4. 桂电第一次程序设计 C STL 排序

    Problem 1197 # 共享厕所 ediszhao添加于2017-12-22 15:00:56 时间限制 : 1000MS 内存限制 : 65536KB ×提示 : 你已解决此题目. 问题描述 ...

  5. QSplitter实现滑动窗口和悬浮按钮

    1         QSplitter实现滑动窗口和悬浮按钮 软件应用中需要设计右侧滑动窗口,通过一个按钮来实现窗口的隐藏和显示,应用场景比如显示主界面的详细信息. (1)   在qt design中 ...

  6. JAVA基础知识总结:十一

    一.内部类 一个类中包含着另外一个类,里面的类被称为内部类,外面的称为外部类 1.成员内部类 和成员变量或者成员方法平级的内部类 语法: 访问权限修饰符 class 外部类类名{ //成员变量 //成 ...

  7. Axure 元件的移动效果

    元件的移动主要是指当点击某一元件(登录)时,某些元件会发生移动或者是左右移动的动画效果,先将登录界面设置为动态面板,然后再设置动作 本节主要应用于一下三种场景: 1.当邮箱不为空.密码为空时,点击登录 ...

  8. HTML第十章总结

    前言 这一章节讲了以下内容: 两个新的 HTML elelments:它们是 <div>和 <span>,使用这两个 element 可以使得 HTML 有更加 serious ...

  9. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单拖放控制

    jQuery EasyUI 树形菜单 - 树形菜单拖放控制 当在一个应用中使用树(Tree)插件,拖拽(drag)和放置(drop)功能要求允许用户改变节点位置.启用拖拽(drag)和放置(drop) ...

  10. every day a practice —— morning(4)

    If there’s one thing New Yorkers love more than discovering a new secret remedy, it’s telling other ...