《Essential ASP.NET 本质论》举例了Socket编程的基本知识,我稍加修改弄了个简单的应用。
你可以将生成的EXE文件拷贝到服务器上,这样通过任意的WEB浏览器都可以获得该服务器的时间。
这是一个仅仅显示服务器时间的WEB服务器,通过Socket、TcpListener、HttpListener三种方式实现,稍加修改可以作为其他应用。

基本代码如下:三种方法实现的简单WEB服务器下载源代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;

/// <summary>
/// 程序目标:设计一个WEB服务器,向客户端输出服务器的当前时间。
/// 设计思想:
///     构造socketServer对象监听本机的某端口,此处为7788。
///     收到客户端连接请求,打印请求信息。
///     获得本机时间,以HTTP协议格式回应客户端请求。
/// 调试:
///     用netstat -ano 查看端口使用情况
/// </summary>
namespace myIIS
{
    class Program
    {

static void Main(string[] args)
        {
            //IIS_Socket();
            //IIS_TcpListener();
            IIS_HttpListener();
        }

private static void IIS_HttpListener()
        {
            if (!HttpListener.IsSupported)
            {
                throw new System.InvalidOperationException("HttpListener必须为Windows XP SP2 或 Server2003 以上系统运行!");
            }

string endpoint = "http://127.0.0.1:7788/";
            HttpListener httpLlisener = new HttpListener();
            httpLlisener.Prefixes.Add(endpoint);
            httpLlisener.Start();
            Console.Write("WEB服务器正在监听 {0}",endpoint);

while (true)
            {
                //GetContext导致线程阻塞,直到请求到达
                HttpListenerContext context = httpLlisener.GetContext();
                //HttpListenerRequest request = context.Request;

//HttpListenerResponse对象的Content属性设置
                HttpListenerResponse response = context.Response;
                string body = string.Format(
                    "<html><head><title>From Socket Server</title></head>" +
                    "<body><h2>Server Time:{0}</h2></body></html>",
                    System.DateTime.Now);
                response.ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(body);
                response.ContentType = "text/html; charset=UTF-8";

System.IO.Stream outputStream = response.OutputStream;
                System.IO.StreamWriter writer = new System.IO.StreamWriter(outputStream);
                writer.Write(body);
                writer.Close();

if (Console.KeyAvailable)
                    break;
            }
            httpLlisener.Stop();
        }

/// <summary>
        /// TcpLisener、TcpClient、NetworkStream
        /// </summary>
        private static void IIS_TcpListener()
        {
            IPAddress address = IPAddress.Loopback;
            IPEndPoint endpoint = new IPEndPoint(address, 7788);

System.Net.Sockets.TcpListener tcpListener = new System.Net.Sockets.TcpListener(endpoint);
            tcpListener.Start();
            Console.WriteLine("WEB服务器监听中{0}\t……",endpoint);

while (true)
            {
                System.Net.Sockets.TcpClient tcpClient = tcpListener.AcceptTcpClient();
                System.Net.Sockets.NetworkStream ns = tcpClient.GetStream();

byte[] buffer = new byte[4096];
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                int length = ns.Read(buffer, 0, buffer.Length);
                string request = utf8.GetString(buffer, 0, length);
                Console.WriteLine("WEB客户端请求信息:\n{0}", request);

byte[] responseStatusBytes = utf8.GetBytes("HTTP/1.1 200 OK\r\n");
                byte[] responseBodyBytes = utf8.GetBytes(string.Format(
                    "<html><head><title>From Socket Server {0}</title></head>" +
                    "<body><h2>Server Time:{1}</h2></body></html>",
                    endpoint.Address, System.DateTime.Now));
                byte[] responseHeaderBytes = utf8.GetBytes(string.Format("Content-Type: text/html;" +
                "charset=UTF-8\r\nContent-length:{0}\r\n", responseBodyBytes.Length));//responseBody.Length

ns.Write(responseStatusBytes, 0, responseStatusBytes.Length);
                ns.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
                ns.Write(new byte[] { 13, 10 }, 0, 2);
                ns.Write(responseBodyBytes, 0, responseBodyBytes.Length);

tcpClient.Close();

if (Console.KeyAvailable)
                    break;
            }
            tcpListener.Stop();
        }

/// <summary>
        /// Socket对象
        /// </summary>
        private static void IIS_Socket()
        {
            //构建IPAddress、IPEndPoint和Socket对象
            System.Net.IPAddress address = System.Net.IPAddress.Any;    //可以Loopback或其他
            System.Net.IPEndPoint endPoint = new System.Net.IPEndPoint(address, 7788);
            System.Net.Sockets.Socket socketServer = new System.Net.Sockets.Socket(
                System.Net.Sockets.AddressFamily.InterNetwork,
                System.Net.Sockets.SocketType.Stream,
                System.Net.Sockets.ProtocolType.Tcp);
            socketServer.Bind(endPoint);  //将Socket绑定到端口上
            socketServer.Listen(10);          //设置挂起链接队列的长度
            Console.Write("WEB服务器正在监听 {0}", endPoint.Port);

while (true)
            {
                //Accept方法会阻塞线程执行,直到接到客户的连接请求,并返回请求连接的Socket对象
                System.Net.Sockets.Socket socketClient = socketServer.Accept();
                Console.Clear();
                Console.WriteLine("\nWEB客户连接请求,来自 {0}", socketClient.RemoteEndPoint);

//开始读取客户的请求数据,转换为UTF8编码,并输出请求信息
                byte[] buffer = new byte[4096];
                int length = socketClient.Receive(buffer, buffer.Length, System.Net.Sockets.SocketFlags.None);
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                string request = utf8.GetString(buffer, 0, length);
                Console.WriteLine("\n客户端请求信息\n{0}", request);
                /*
                [Client Established from 127.0.0.1:3438]
                [Received Request Information From WEB Client]:
                GET / HTTP/1.1
                Host: 127.0.0.1:7788
                User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4
                .0
                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* /*;q=0.8
                Accept-Language: zh-cn,zh;q=0.5
                Accept-Encoding: gzip, deflate
                Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
                Keep-Alive: 115
                Connection: keep-alive
                Cache-Control: max-age=0                 
                 */

//--应答请求,为便于WEB客户端连接,构造HTTP协议体:状态行、回应体、回应头
                string responseStatus = "HTTP/1.1 200 OK\r\n";
                byte[] responseStatusBytes = utf8.GetBytes(responseStatus);

string responseBody = string.Format(
                    "<html><head><title>From Socket Server {0}</title></head>" +
                    "<body><h2>Server Time:{1}</h2></body></html>",
                    endPoint.Address, System.DateTime.Now);
                byte[] responseBodyBytes = utf8.GetBytes(responseBody);

string responseHeader = string.Format("Content-Type: text/html;" +
                "charset=UTF-8\r\nContent-length:{0}\r\n", responseBody.Length);
                byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);

//--向WEB客户的发送信息:回应状态行、回应头、空行、回应体
                socketClient.Send(responseStatusBytes);
                socketClient.Send(responseHeaderBytes);
                socketClient.Send(new byte[] { 13, 10 });
                socketClient.Send(responseBodyBytes);

socketClient.Close();
                if (Console.KeyAvailable)
                    break;
            }
            socketServer.Close();
        }
    }
}

转载于:https://www.cnblogs.com/flaaash/archive/2011/04/09/2010663.html

三种方法构建简单的WEB服务器!相关推荐

  1. 使用Vue三种方法实现简单计算器

    使用Vue三种方法实现简单计算器 代码实现了一个简单的计算器,用户可以在输入框中输入两个数字,选择一个操作符,并点击"等于"按钮,Vue.js会根据用户的输入进行计算,并将结果显示 ...

  2. 怎么给视频配音?短视频作者在用的三种方法,简单易操作

    怎么给视频配音?短视频作者在用的三种方法,简单易操作 如果你也是做短视频的作者,那么相信你也一定知道,做短视频并不仅仅只是简单的拍摄剪辑发布而已,其中要做的工作还有很多,比如配音就是其中的一项.虽然并 ...

  3. 使用三种方法搭建虚拟机III Web网站的方法

    实验环境:虚拟机Windows Server 2008(需先安装号IIS服务) IP:192.168.139.128测试环境:物理机Windows 10搭建虚拟主机网站的三种方法:方式一:两个网站同一 ...

  4. word流程图整体怎么拆分_word流程图-不会做流程图?这三种方法超级简单!

    在平时的办公过程中,我们一定是要会做流程图的,因为很多地方都需要使用到流程图,下面小编教大家三种方法做流程图,非常简单,一看就会! 一,在Word中制作流程图 1,新建画布 首先点击"插入& ...

  5. 怎么用计算机要微信,电脑端要实现“微信双开”功能,三种方法,简单实用!...

    在我们的日常生活中,微信它已经不仅仅是一个聊天工具了,我们的许多工作很多时候也离不开它. 有时我们想把生活和工作分开,很多人都有两个微信号,一个工作号一个生活号:工作号用于工作日的业务,生活号用于日常 ...

  6. 如何将文字转化为语音?三种方法超级简单,立刻就能学会!

    是不是有很多小伙伴在剪辑视频时,想要把旁白给文字转成语音,因为可能会担心如果自己录制配音的话,自己普通话不标准.或者声音不好听,害怕会影响视频的质量.这时,智能文字转语音配音工具就派上用场了,输入文字 ...

  7. 清空数组的三种方法,简单直观

    清空数组这的方法其实很简单,常见的有三种: 1. 给数组的length设置为0 arr.length = 0 前提是该语言中数组的length是可写可读. 2. 直接赋值为空数组 arr = [] 3 ...

  8. 拖动精灵的三种方法比较

     构建Ball精灵: Ball.as package  {     import flash.display.Sprite; public class Ball extends Sprite      ...

  9. 三种方法实现移动端HTTPS加速和省电

    HTTPS网站的普及使大家更加关注HTTPS性能优化,一般做HTTPS优化可能只是针对PC端,在移动端的效果并不理想.去年Google就已经在移动端做了HTTPS的性能加速,为Android平台的Ch ...

最新文章

  1. Linux-NFS——配置过程
  2. 深入ASP.NET数据绑定(上)
  3. 采访 | Dou. 愿你背着相机出行,归来仍是少年。
  4. SAP OData etag flag setting in metadata MPC_EXT
  5. 面试中Handler这些必备知识点你都知道吗?面试真题解析
  6. 【数据结构与算法】【算法思想】贪心算法
  7. 列运算_DAX表操作基础第二招:增加列
  8. Latex 表格内文字过长自动换行 表格内单元格内容强制换行
  9. 漂亮的自适应宽度的多色彩CSS图片按钮
  10. 循环 计算数值的整数次幂
  11. OpenCV 文本显示 putText 和 getTextSize
  12. CASIA WebFace、WIDDER FACE、FDDB、AFLW、CelebA训练集详解
  13. Office之下拉字体选项名称为英文
  14. 在matlab使用矩阵的方法计算DFT
  15. echarts 背景颜色 渐变色,阴影效果
  16. erp软件的优点和用途
  17. 推荐这3款图片流动特效神器,一键即可让照片“动”起来
  18. JAVA 订单号生成类
  19. bcdedit添加linux引导,用BCDEdit编辑启动菜单
  20. 术语解释(PV、UV、QPS、TPS)

热门文章

  1. 怎么取消XP粘滞键(StickyKeys)
  2. 推荐好用的linux系统(manjaro)
  3. mysql exp 注入_使用exp进行SQL报错注入
  4. 判断语句_如何学好C语言判断语句?攻略if语句是第一步
  5. csgo 机器人模式_分享一个休闲模式机器人Bug
  6. Educational Codeforces Round 64 Div.2 D - 0-1-Tree
  7. 条码标签打印软件如何实现标签重复打印
  8. #react 之ant design Pro 学习研究#----启动项目
  9. 将EnyimMemcached从.NET Core RC1升级至RC2
  10. 让redhat5以yum方式安装软件