一个简单的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 ...
随机推荐
- Linux下如何查看tomcat是否启动
在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...
- MANIFEST.INF!JAR规范中
MANIFEST.INF!JAR规范中 META-INF 目录中内容心得.顺带整理了网上资料,提供地址 标签: jarjava产品sunantapache 2012-03-31 17:09 2768人 ...
- 从0开始学Java——JSP&Servlet——Tomcat和Apache的区别
从<JSP & Servlet 学习笔记>的第一章,了解到web容器:“Web容器是Servlet/jsp唯一认得的http服务器”. 在Java中,容器的类型有多种,这里要说的是 ...
- [CareerCup] 10.4 Find All Duplicates Elements 寻找所有的重复项
10.4 You have an array with all the numbers from 1 to N, where N is at most 32,000. The array may ha ...
- LeetCode-Count Univalue Subtrees
Given a binary tree, count the number of uni-value subtrees. A Uni-value subtree means all nodes of ...
- Opencv step by step - 配置文件
有时候,我们需要用配置文件存储一些图像或者视频的信息. 先来一个简单的例子: #include <cv.h> #include <highgui.h> int main(int ...
- 分布式人工智能标记语言(DAIML)示例
DAIML(Distributed Artificial Intelligence Markup Language)是用于分布式人工智能系统中智能语言的标记库.DAIML主要分为Patte ...
- Grunt-cli的执行过程以及Grunt加载原理
通过本篇你可以了解到: 1 grunt-cli的执行原理 2 nodeJS中模块的加载过程 Grunt-cli原理 grunt-cli其实也是Node模块,它可以帮助我们在控制台中直接运行grunt命 ...
- 网站开发技巧, 使用byte[]持久化用户个性设置
场景, 网站用户的个性化配置较多, 而且容易发生增加和改变, 如何在数据库保存是个问题. 为了避免数据库表字段经常变更, 我们设计在表增加一个varbinary(max)字段存储个性化配置. 个性化的 ...
- Memcached——非关系型数据库分布式处理
Memcached登录校验应用: MMCacheWriter.cs类 using Memcached.ClientLibrary; using System; using System.Collect ...