• 一个简单的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, 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
    ";
                    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
    Content-Length: {0}
    ", 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服务器,了解你在浏览器输入地址,然后回车,服务端是如何处理的以及如何响应的。

     

  • 相关阅读:
    时序图
    用例图
    欢迎界面(闪屏)
    WBS
    闲来听书
    软件团队的模式
    结对编程
    在个人项目中,找bug,审核代码.
    时序图
    部分功能的实现
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/5188994.html
Copyright © 2020-2023  润新知