基于TcpListener的web服务器
写在前面
上篇文章根据《asp.net 本质论》书上提供的例子,实现了一个简单的web服务器,本篇文章将介绍另一种实现方式——基于TcpListener的web服务器。
TcpListener
命名空间System.Net.Sockets下的TcpListener类简化了基于tcp协议的监听程序。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace TcpListenerWebServer
{
class Program
{
static void Main(string[] args)
{
//取得本机的loopback网络地址,即127.0.0.1
IPAddress ip = IPAddress.Loopback;
//创建可以访问的网络端点,8888表示端口号
IPEndPoint endpoint = new IPEndPoint(ip, );
//初始化tcp监听器
/*
* 传入监听的端点参数,通过构造函数初始化监听器,
* 不再关注如何设置网络协议等细节,
* 具体可以和上篇文章的方式进行对比。
*/
TcpListener listener = new TcpListener(endpoint);
//开启监听器
listener.Start();
//打印提示
Console.WriteLine("监听开始......");
while (true)
{
//AcceptTcpClient方法将阻塞进程,直到一个客户端的连接到达监听器,返回一个TcpClient类型的对象。可通过该对象与客户端进行通信
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("与客户端已经建立连接.....");
//得到一个网络流,通过TcpClient可以得到一个用于输入和输出的网络流对象NetworkStream,对Socket的输入和输出进行了封装。
NetworkStream ns = client.GetStream();
//处理过程使用utf8 进行编码
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
//设置用于接收的字节数组
byte[] buffer = new byte[];
int length = ns.Read(buffer, , buffer.Length);
//得到请求内容
string requestString = utf8.GetString(buffer, , length);
//打印
Console.WriteLine(requestString);
//回应的状态行
string statusLine = "HTTP/1.1 200 OK\r\n";
byte[] statusLineBuffer = utf8.GetBytes(statusLine);
//准备发送到客户端的网页
string responseBody = "<html><head><title>这是一个web服务器的测试</title></head><body><h1>Hello World.</h1></body></html>";
byte[] responseBodyBuffer = utf8.GetBytes(responseBody);
//回应的头部
string responseHeader = string.Format(
"Content-Type:text/html;charset=UTF-8\r\nContent-Length: {0}\r\n", responseBodyBuffer.Length);
byte[] responseHeaderBuffer = utf8.GetBytes(responseHeader);
//响应状态行
ns.Write(statusLineBuffer, , statusLineBuffer.Length);
//响应头部
ns.Write(responseHeaderBuffer, , responseHeaderBuffer.Length);
//输出头部与内容之间的空行
ns.Write(new byte[] { , }, , );
//输出内容部分
ns.Write(responseBodyBuffer, , responseBodyBuffer.Length);
//关闭与客户端的连接
client.Close();
break;
}
//关闭服务器监听
listener.Stop();
Console.Read();
}
}
}
启动服务器,并在浏览器中输入http://localhost:8888/


总结
TcpListener类,简化了对tcp协议的监听,通过TcpClient可以得到网络流,然后就可以对网络的输入和输出进行操作了,用起来更方便。
基于TcpListener的web服务器的更多相关文章
- 基于HttpListener的web服务器
写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener Ht ...
- 基于OWin的Web服务器Katana发布版本3
当 ASP.NET 首次在 2002 年发布时,时代有所不同. 那时,Internet 仍处于起步阶段,大约有 5.69 亿用户,每个用户平均每天访问 Internet 的时间为 46 分钟,大约有 ...
- Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...
- c++ 网络编程(十一) LINUX下 初步制作基于HTTP的WEB服务器
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9663028.html HTTP概要 理解Web服务器端: 编写HTTP(超文本传输协议)服务器 ...
- 树莓派搭建基于flask的web服务器-通过移动端控制LED
1.概述 在局域网内,基于flask搭建web服务,从而可以使用移动客户端访问该web服务.由于是flask新手,所以本次实现的web服务功能较为简单,即控制LED灯的开/关及闪烁. 2.准备工作 2 ...
- 基于nginx实现web服务器的双机热备
1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...
- 基于TcpListerer的web服务器 和 基于HttpListerer的web服务器
摘自<Asp.Net 本质论>作者:郝冠军 /* 为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListerer类,使用它,在构造函 ...
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener
atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs ...
- [C# 网络编程系列]专题三:自定义Web服务器
转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...
随机推荐
- win7系统cmd命令切换到指定文件夹目录
win7 系统下的cmd命令,直接cd命令切换盘符和以往有些不同,现在默认只能在当前盘符中改变目录,如果要改变盘符则需要多加一个/d命令.如下图所示:(对cd命令的帮助 大家可借助help cd命令进 ...
- 关于matlab中特殊字符, 上标和下标
'T=25\circC',(摄氏度) 下标用 _{下划线} 上标用^ (尖号) 希腊字母等特殊字符用 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Ga ...
- Nutch搜索引擎(第4期)_ Eclipse开发配置
1.环境准备 1.1 本期引言 前三期分别介绍了Nutch与Solr在Linux上面的安装,并做了简单的应用,这一期从开发的角度进行,因为我们日常最熟悉的开发环境是Windows,所以本期详细介绍Wi ...
- 20135220谈愈敏Linux Book_3
第3章 进程管理 进程是Unix操作系统抽象概念中最基本的一种,进程管理是操作系统的心脏所在. 3.1 进程 进程:处于执行期的程序以及相关的资源的总称. 线程:在进程中活动的对象,拥有独立的程序计数 ...
- Unity3D 游戏计时功能实现
最近工作实在是太忙了,没办法认真写博客,但是还是要好好记录下日常的学习. 需求 各类游戏中都大量运用到计时功能,不管是直接显示的在前端UI,还是后台运行. 思路 Unity中提供了Time类可以方便的 ...
- 记录nginx 搭建集群环境踏过的坑
因为生产环境做了负载均衡,为了尽可能跟线上环境一致,所以想在本地也搭集群,这样测试更靠谱.首先就想到nginx 这货,搭个简单的web 服务器实在太简单了. nginx 这玩意11年简单玩过,那是版本 ...
- redis学习笔记——(3)
7.Redis中的set类型 sadd set value:向set中添加元素value. srem set value:删除set中的元素value. spop set:随机返回并删除s ...
- Excel如何查找名字重复的数据
来源于:http://jingyan.baidu.com/article/414eccf6091ff86b431f0aec.html Cokery今天在帮助同事整理数据的时候遇到了一个难题,就是在Ex ...
- 使用nginx绑定域名,代理gitlab
默认情况下,gitlab通过自带的unicorn来充当web页面的,不用nginx也可以,这里我们使用nginx代理vim /etc/yum.reos.d/nginx.repo # 编辑nginx.r ...
- iOS边练边学--iOS中的json数据解析
JSON数据(NSData) -> OC对照表 {} -> NSDictionary @{} [] -> NSArray @[] "jack" -> NSS ...