写在前面

上篇文章根据《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服务器的更多相关文章

  1. 基于HttpListener的web服务器

    写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener Ht ...

  2. 基于OWin的Web服务器Katana发布版本3

    当 ASP.NET 首次在 2002 年发布时,时代有所不同. 那时,Internet 仍处于起步阶段,大约有 5.69 亿用户,每个用户平均每天访问 Internet 的时间为 46 分钟,大约有 ...

  3. Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...

  4. c++ 网络编程(十一) LINUX下 初步制作基于HTTP的WEB服务器

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9663028.html HTTP概要 理解Web服务器端: 编写HTTP(超文本传输协议)服务器 ...

  5. 树莓派搭建基于flask的web服务器-通过移动端控制LED

    1.概述 在局域网内,基于flask搭建web服务,从而可以使用移动客户端访问该web服务.由于是flask新手,所以本次实现的web服务功能较为简单,即控制LED灯的开/关及闪烁. 2.准备工作 2 ...

  6. 基于nginx实现web服务器的双机热备

    1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...

  7. 基于TcpListerer的web服务器 和 基于HttpListerer的web服务器

    摘自<Asp.Net 本质论>作者:郝冠军 /* 为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListerer类,使用它,在构造函 ...

  8. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener

    atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs   ...

  9. [C# 网络编程系列]专题三:自定义Web服务器

    转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...

随机推荐

  1. caffe windows 学习第一步:编译和安装(vs2012+win 64)

    没有GPU,没有linux, 只好装caffe的windows版本了. 我的系统是win10(64位),vs 2012版本,其它什么都没有装,因此会需要一切的依赖库. 其实操作系统只要是64位就行了, ...

  2. [CareerCup] 8.8 Othello Game 黑白棋游戏

    8.8 Othello is played as follows: Each Othello piece is white on one side and black on the other. Wh ...

  3. Linux(9.14-9.20)学习笔记

    实验一 Linux系统简介 一.Linux 为何物 Linux 就是一个操作系统,Linux 也就是系统调用和内核那两层. 二.Linux 历史简介 操作系统始于二十世纪 50 年代,当时的操作系统能 ...

  4. Jenkins进阶系列之——10Publish Over SSH插件

    说明:这个插件可以通过ssh连接其他Linux机器 官方说明:Publish Over SSH 安装步骤: 系统管理→管理插件→可选插件→Artifact Uploaders→Publish Over ...

  5. 学习笔记——Maven实战(十)Maven 3,是时候升级了

    去年10月份Apache Maven发布了3.0正式版,而在上个月的22号,Eclipse基金会宣布了Eclipse 3.7(Indigo)的发布,该版本Eclipse最大的新特性之一就是集成了Mav ...

  6. ArcGIS中的北京54和西安80投影坐标系详解

    ArcGIS中的北京54和西安80投影坐标系详解 1.首先理解地理坐标系(Geographic coordinate system),Geographic coordinate system直译为地理 ...

  7. Boostrap(4)

    1.按钮 <!doctype html> <html> <head> <meta charset="utf-8"> <titl ...

  8. C#基础知识系列五(构造函数)

    前言 本节主要来学习下实例构造函数.私有构造函数和静态构造函数. 构造函数的作用: 1.当一个类在new实例化对象时,可调用构造函数进行初始化对象. 2.不带参数的构造函数称为“默认构造函数”. 无论 ...

  9. 【Moqui业务逻辑翻译系列】Story of Online Retail Company 在线零售公司的故事

    h1. Story of Online Retail Company 在线零售公司的故事 Someone decides to sell a product. [Product Marketer Ma ...

  10. WPF--调用线程必须为 STA,因为许多 UI 组件都需要(转载)

    自VS2005开始,UI元素在不同线程中访问就受到限制了,当然你也可以解除这种限制 以下提供Framework3.0的解决方案发: public partial class Window1 : Win ...