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

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

服务端收到的请求内容

总结

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

 

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/5188994.html

相关文章
|
22小时前
【计网·湖科大·思科】实验一 熟悉仿真软件及访问WEB服务器
【计网·湖科大·思科】实验一 熟悉仿真软件及访问WEB服务器
7 0
|
22小时前
|
存储 安全 数据安全/隐私保护
Web应用程序的会话管理是一种跟踪和识别特定用户与Web服务器之间交互的技术
【5月更文挑战第12天】Python Web开发中,会话管理用于跟踪用户与服务器交互,如Flask框架提供的内置功能。以下是一个简单示例:安装Flask后,设置应用密钥,通过session读写用户状态。例如,创建一个显示和设置用户名称的Web应用,用户提交的名字将保存在会话中。在生产环境中,应安全存储密钥,如使用环境变量。扩展会话管理可借助第三方库实现更多功能,但可能需更多配置。
57 2
|
22小时前
|
缓存 负载均衡 安全
深入探索Nginx高性能Web服务器配置与优化
【5月更文挑战第7天】本文深入探讨了Nginx的配置与优化,重点介绍了基础配置参数如`worker_processes`、`worker_connections`和`keepalive_timeout`,以及优化策略,包括使用epoll事件驱动模型、开启gzip压缩、启用缓存、负载均衡和安全配置。此外,还提到了性能调优工具,如ab、nginx-stats和nmon,以助于提升Nginx的性能和稳定性。
|
22小时前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
28 1
|
22小时前
|
机器学习/深度学习 数据挖掘 Python
使用Python实现简单的Web服务器
使用Python内置的http.server模块,本文演示了创建基本Web服务器的步骤。通过编写简单的代码,实现响应GET请求并返回“Hello, World!”。此外,还展示了如何扩展服务器功能,处理不同URL路径,如根路径和/about路径,并实现404错误页面。这个基础教程为理解HTTP服务器原理和Python网络编程入门提供了帮助。对于复杂Web应用,建议使用Flask或Django等高级框架。
|
22小时前
|
负载均衡 监控 Unix
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
|
22小时前
|
Apache
web服务器(Apache)访问日志(access_log)详细解释
web服务器(Apache)访问日志(access_log)详细解释
|
22小时前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
33 0
|
22小时前
|
弹性计算
阿里云ECS的使用心得
本文主要讲述了我是如何了解到ECS,使用ECS的一些经验,以及自己的感悟心得
|
22小时前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。