写在前面

新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍。

一个简单的web服务器

首先需要引入命名空间: System.Net,关于网络编程的大部分类型及操作都可以在这个命名空间下找到。

IPAddress:类用来表示一个ip地址。

IPEndPoint:用来表示一个IP地址和一个端口号的组合,称为网络的端点。

System.Net.Sockets:命名空间中提供了基于Socket编程的数据类型。

Socket类封装了Socket的操作。

常见操作:

Listen:设置基于连接通信的socket进入监听状态,并设置等待队列的长度。

Accept:等待一个新的连接,当新连接到达的时候,返回一个针对新连接的Socket对象。通过这个新的socket对象,可以与新的连接通信。

Receive:通过Socket接收字节数据,保存到一个字节数组中,返回实际接收的字节数。

Send:通过socket发送预先保存在字节数组中的数据。

通过socket创建一个简单的web服务器,通过端口8888访问该服务器,向浏览器返回一个静态页面。这个示例,通过浏览器发送请求,并由服务器生成消息响应给浏览器。

web服务器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace WebServer
{
class Program
{
static void Main(string[] args)
{
//取得本机的loopback网络地址,即127.0.0.1
IPAddress ip = IPAddress.Loopback;
//创建可以访问的端点,8888表示一个端口号,如果设置为0,表示一个空闲的端口号
IPEndPoint endPoint = new IPEndPoint(ip, );
//创建socket,使用ipv4地址,传输控制协议tcp,双向可靠基于连接的字节流
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将socket绑定到一个端点上
socket.Bind(endPoint);
//设置连接队列的长度
socket.Listen();
Console.WriteLine(" 开始监听,端口号:{0}", endPoint.Port);
while (true)
{
//开始监听,这个方法会阻塞线程的执行,直到收到一个客户端的连接请求
Socket client = socket.Accept();
//输出客户端的地址
Console.WriteLine(client.RemoteEndPoint);
//准备读取客户端请求的数据,去读的数据将保存在一个数组中
byte[] buffer = new byte[];
//接收数据
int length = client.Receive(buffer, buffer.Length, SocketFlags.None);
//将请求的数据翻译为utf8
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
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);
//向客户端发送状态消息
client.Send(statusLineBuffer);
//向客户端发送回应头
client.Send(responseHeaderBuffer);
//头部与内容的分割行
client.Send(new byte[] { , });
//向客户端发送内容部分
client.Send(responseBodyBuffer);
//断开与客户端的连接
client.Close();
//关闭服务器
socket.Close();
break;
}
Console.Read();
}
}
}

启动服务器,并在浏览器中输入http://localhost:8888/

服务端收到的请求内容

总结

通过搭建这个简单的web服务器,了解你在浏览器输入地址,然后回车,服务端是如何处理的以及如何响应的。

一个简单的web服务器的更多相关文章

  1. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  2. [置顶] 在Ubuntu下实现一个简单的Web服务器

    要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...

  3. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  4. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  5. 利用 nodeJS 搭建一个简单的Web服务器(转)

    下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...

  6. 《深度解析Tomcat》 第一章 一个简单的Web服务器

    本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...

  7. 一个简单的Web服务器-支持Servlet请求

    上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...

  8. 一个简单的Web服务器-支持静态资源请求

    目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...

  9. 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

随机推荐

  1. Activiti系列:几个历史数据表之间的关系

    1. 一个流程执行完之后,会在act_hi_procinst表内产生一条数据: 3. 一个流程中的每个节点都会在act_hi_actinst表内产生一条数据,比如下面这个流程执行完之后会在在act_h ...

  2. ubuntu14.04上安装Mysql-5.7.11

    先安装好操作系统   在Mysql官网上下载最新版的Ubuntu Linux专用的Mysql.我这里下载的是:mysql-server_5.7.11-1ubuntu14.04_amd64.deb-bu ...

  3. linux内核分析 课程总结

    Linux内核分析 链接汇总 Linux内核分析第一周学习总结--计算机是如何工作的 Linux内核分析第二周学习总结--操作系统是如何工作的 Linux内核分析第三周学习总结--构造一个简单的Lin ...

  4. 对于JAVA课程的期望

    对于JAVA课程的期望 我对于JAVA这门课程最初的了解可能来自于学长学姐的描述,或者是选课指南上简单的课程名称,那个时候的JAVA,对我来说遥远而又陌生,显得那么高大上,但是一转眼自己马上就要结束大 ...

  5. Android开发之高效加载Bitmap

    一.概述 在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory).这篇文章我们会介绍如何高效地在Android开发中使用Bi ...

  6. BinaryWrite方法输出验证码

    在创建网站中验证码是不可或缺的.可以利用BinaryWrite输出二进制图像的方法输出验证码. 在开发图形验证码时,首先生成验证码,然后绘制成图像,最后通过该方法输出到页面中.所以熟练地掌握该方法可以 ...

  7. JavaScript 里 new 出来的对象 怎么销毁它?

    JavaScript的规范(ECMA-262 ECMAScript)没规定JavaScript引擎要如何实现对JavaScript对象的内存管理.实际实现中几乎所有JavaScript引擎都使用基于跟 ...

  8. SQL温故系列两篇(二)

    .Sql 插入语句得到自动生成的递增的ID值 Insert into Table(name,des,num) values(’ltp’,’thisisbest’,10); Select @@ident ...

  9. 第二十八课:focusin与focusout,submit,oninput事件的修复

    focusin与focusout 这两个事件是IE的私有实现,能冒泡,它代表获得焦点或失去焦点的事件.现在只有Firefox不支持focusin,focusout事件.其实另外两个事件focus和bl ...

  10. [设计模式] javascript 之 抽象工厂模式

    抽象工厂模式说明 1. 工厂方法模式的问题: 在工厂方法模式里,创建类都需要通过 工厂类,如果要扩展程序,就必须修改工厂类,这违背了闭包原则,对扩展开放,对修改关闭:对于设计有一定的问题. 2. 如何 ...