一个简单的web服务器
写在前面
新的一年了,新的开始,打算重新看一遍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服务器的更多相关文章
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- [置顶] 在Ubuntu下实现一个简单的Web服务器
要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...
- Tomcat剖析(一):一个简单的Web服务器
Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- 利用 nodeJS 搭建一个简单的Web服务器(转)
下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...
- 《深度解析Tomcat》 第一章 一个简单的Web服务器
本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...
- 一个简单的Web服务器-支持Servlet请求
上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...
- 一个简单的Web服务器-支持静态资源请求
目标 实现一个简单的Web服务器,能够根据HTTP请求的URL响应对应的静态资源,如果静态资源不存在则响应404. HttpServer 使用ServerSocket实现的一个服务器,request根 ...
- 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...
随机推荐
- livewriter写Blog 神秘失踪?
现在习惯用livewriter来总结/记录一些知识并发布为Blog 与同行交流,但是今天发生了一个怪事,上午我整理了两篇文档当时就用livewriter发送到了Blog上,但是晚上来看的时候之前发送的 ...
- LeetCode:Binary Tree Level Order Traversal I II
LeetCode:Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of ...
- 发布HTML5 RTS游戏-古代战争
古代战争 游戏介绍 "古代战争"是一个2.5D即时战略游戏,使用了帝国时代2的素材,并参考了它的游戏设计和玩法. 游戏基于YEngine2D引擎开发,具备生产.建造.资源采集.战斗 ...
- 浅析java类加载器ClassLoader
作为一枚java猿,了解类加载器是有必要的,无论是针对面试还是自我学习. 本文从JDK提供的ClassLoader.委托模型以及如何编写自定义的ClassLoader三方面对ClassLoader做一 ...
- 微信小程序全面实战,架构设计 && 躲坑攻略(小程序入门捷径教程)
最近集中开发了两款微信小程序,分别是好奇心日历(每天一条辞典+一个小投票)和好奇心日报(轻量版),直接上图: Paste_Image.png 本文将结合具体的实战经验,主要介绍微信小程序的基础知识.开 ...
- 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)
方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...
- NoSQL数据库之国产开源产品:SequoiaDB 分析前言
随着互联网技术的发展,面对海量数据的存储和分析,传统关系型数据库已经无法满足,由此衍生出一种与关系型数据库区别开的数据库NoSQL(Not Only SQL). 国外做的比较成熟的NoSQL有Mong ...
- [AaronYang]C#人爱学不学[3]
本文章不适合入门,只适合有一定基础的人看.我更相信知识细节见高低,我是从4.0开始学的,终于有时间系统的学习C#5.0,是5.0中的知识,会特殊标记下.但写的内容也可能含有其他版本framework的 ...
- android学习——Android Studio下创建menu布局文件
一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...
- 在Myeclipse buildpath 加server lib (server runtime)/项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
来源于:http://blog.csdn.net/dingqinghu/article/details/8805922 http://yl-fighting.iteye.com/blog/140946 ...