博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的web服务器
阅读量:6608 次
发布时间:2019-06-24

本文共 3214 字,大约阅读时间需要 10 分钟。

写在前面

新的一年了,新的开始,打算重新看一遍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, 8888);            //创建socket,使用ipv4地址,传输控制协议tcp,双向可靠基于连接的字节流            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //将socket绑定到一个端点上            socket.Bind(endPoint);            //设置连接队列的长度            socket.Listen(10);            Console.WriteLine(" 开始监听,端口号:{0}", endPoint.Port);            while (true)            {                //开始监听,这个方法会阻塞线程的执行,直到收到一个客户端的连接请求                Socket client = socket.Accept();                //输出客户端的地址                Console.WriteLine(client.RemoteEndPoint);                //准备读取客户端请求的数据,去读的数据将保存在一个数组中                byte[] buffer = new byte[4096];                //接收数据                int length = client.Receive(buffer, buffer.Length, SocketFlags.None);                //将请求的数据翻译为utf8                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;                string requestString = utf8.GetString(buffer, 0, length);                //打印请求内容                Console.WriteLine(requestString);                //回应的状态行                string statusLine = "HTTP/1.1 200 OK\r\n";                byte[] statusLineBuffer = utf8.GetBytes(statusLine);                //准备发送到客户端的网页                string responseBody = "这是一个web服务器的测试

Hello World.

"; 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[] { 13, 10 }); //向客户端发送内容部分 client.Send(responseBodyBuffer); //断开与客户端的连接 client.Close(); //关闭服务器 socket.Close(); break; } Console.Read(); } }}

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

服务端收到的请求内容

总结

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

 

转载于:https://www.cnblogs.com/wolf-sun/p/5188994.html

你可能感兴趣的文章
古中国数学家的计算力真是惊人
查看>>
Java基础-算术运算符(Arithmetic Operators)
查看>>
C#编程(四十七)----------集合接口和类型
查看>>
【转】关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
查看>>
积跬步,聚小流------Bootstrap学习记录(1)
查看>>
HDUPhysical Examination(贪心)
查看>>
HTML5 FileAPI
查看>>
使用tdcss.js轻松制作自己的style guide
查看>>
C++中public、protected及private用法
查看>>
苹果公司的产品已用完后门与微软垄断,要检查起来,打架!
查看>>
顶级的JavaScript框架、库、工具及其使用
查看>>
AYUI -AYUI风格的 超美 百度网盘8.0
查看>>
用MPMoviePlayerController做在线音乐播放
查看>>
【前端笔记】彻底理解变量与函数的声明提升
查看>>
Android 反编译利器,jadx 的高级技巧
查看>>
Android官方架构组件LiveData: 观察者模式领域二三事
查看>>
[Android组件化]组件化数据分享
查看>>
你必须知道的HTTP基本概念
查看>>
当下拉列表数据过大时,该如何应对?
查看>>
使用OpenGrok搭建 可搜索可跳转的源码 阅读网站
查看>>