C#中使用Socket实现简单Web服务器

C#中使用Socket实现简单Web服务器,第1张

概述原文地址:https://www.cnblogs.com/mq0036/p/6656888.html 最近有个web的小项目,但公司的电脑无法安装IIS,所以就想自己来实现个Web server服务器,原本想了下,也就是socket处理http请求,于是就在博客园中搜索了“socket实现web server”,结果还真搜索到一些文章,于是从中找了几个做参考,如下: C#中使用Socket实现简单

原文地址:https://www.cnblogs.com/mq0036/p/6656888.HTML

最近有个web的小项目,但公司的电脑无法安装IIS,所以就想自己来实现个Web server服务器,原本想了下,也就是socket处理http请求,于是就在博客园中搜索了“socket实现web server”,结果还真搜索到一些文章,于是从中找了几个做参考,如下:

C#中使用Socket实现简单Web服务器

C#中使用Socket模拟请求Web服务器过程

C#中自己动手创建一个Web Server(非Socket实现)

其他的这里就不一一列出了,感兴趣的可以自己搜索看看。

所以我根据他们的代码,然后自己在修改符合自己使用的情况,初次版本就出来了,代码如下:

using System;using System.Collections.Generic;using System.linq;using System.Text;using System.Net;using System.Net.sockets;namespace socket_webServer{    class Program    {        static Socket _socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  //侦听socket        static string webroot = @"C:\Users\jack\Desktop\";        static string defaultPage = "index.HTML,home.HTML";        static voID Main(string[] args)        {            webroot = @"C:\_jack\DevCode";            _socket.Bind(new IPEndPoint(IPAddress.Any,8080));            _socket.Listen(100);            _socket.BeginAccept(new AsyncCallback(OnAccept),_socket);  //开始接收来自浏览器的http请求(其实是socket连接请求)            writeLog("Socket Web Server 已启动监听!" + Environment.Newline + "  监听端口:" + ((IPEndPoint)_socket.LocalEndPoint).Port);            Console.ReadKey();        }        /// <summary>        /// 接受处理http的请求        /// </summary>        /// <param name="ar"></param>        static voID OnAccept(IAsyncResult ar)        {            try            {                Socket socket = ar.AsyncState as Socket;                Socket web_clIEnt = socket.EndAccept(ar);  //接收到来自浏览器的代理socket                //NO.1  并行处理http请求                socket.BeginAccept(new AsyncCallback(OnAccept),socket); //开始下一次http请求接收   (此行代码放在NO.2处时,就是串行处理http请求,前一次处理过程会阻塞下一次请求处理)                byte[] recv_Buffer = new byte[1024 * 640];                int recv_Count = web_clIEnt.Receive(recv_Buffer);  //接收浏览器的请求数据                string recv_request = EnCoding.UTF8.GetString(recv_Buffer,0,recv_Count);                writeLog("Data Request : " + recv_request);  //将请求显示到界面                //Resolve(recv_request,web_clIEnt);  //解析、路由、处理                byte[] cont = pageHandle(RouteHandle(recv_request));                sendPageContent(cont,web_clIEnt);                //NO.2  串行处理http请求            }            catch (Exception ex)            {                writeLog("处理http请求时出现异常!" + Environment.Newline + "\t" + ex.Message);            }        }        static voID sendPageContent(byte[] pageContent,Socket response)        {            string statusline = "http/1.1 200 OK\r\n";   //状态行            byte[] statusline_to_bytes = EnCoding.UTF8.GetBytes(statusline);            string content =            "<HTML>" +                "<head>" +                    "<Title>socket webServer  -- Login</Title>" +                "</head>" +                "<body>" +                   "<div style=\"text-align:center\">" +                       "欢迎您!" + "" + ",今天是 " + DateTime.Now.TolongDateString() +                   "</div>" +                "</body>" +            "</HTML>";  //内容            byte[] content_to_bytes = pageContent;            string header = string.Format("Content-Type:text/HTML;charset=UTF-8\r\nContent-Length:{0}\r\n",content_to_bytes.Length);            byte[] header_to_bytes = EnCoding.UTF8.GetBytes(header);  //应答头                        response.Send(statusline_to_bytes);  //发送状态行            response.Send(header_to_bytes);  //发送应答头            response.Send(new byte[] { (byte)\r,(byte)\n });  //发送空行            response.Send(content_to_bytes);  //发送正文(HTML)            response.Close();        }        /// <summary>        ///         /// </summary>        /// <param name="request"></param>        /// <returns></returns>        static string RouteHandle(string request)        {            string retRoute = "";            string[] strs = request.Split(new string[] { "\r\n" },StringSplitoptions.None);  //以“换行”作为切分标志            if (strs.Length > 0)  //解析出请求路径、post传递的参数(get方式传递参数直接从url中解析)            {                string[] items = strs[0].Split( );  //items[1]表示请求url中的路径部分(不含主机部分)                string pagename = items[1];                string post_data = strs[strs.Length - 1]; //最后一项                //Dictionary<string,string> dict = ParameterHandle(strs);                retRoute = pagename + (post_data.Length > 0 ? "?" + post_data : "");            }            return retRoute;        }        /// <summary>        /// 按照http协议格式,解析浏览器发送的请求字符串        /// </summary>        /// <param name="strs"></param>        /// <returns></returns>        static Dictionary<string,string> ParameterHandle(string[] strs)        {            Dictionary<string,string> param = new Dictionary<string,string>();            if (strs.Length > 0)  //解析出请求路径、post传递的参数(get方式传递参数直接从url中解析)            {                if (strs.Contains(""))  //包含空行  说明存在post数据                {                    string post_data = strs[strs.Length - 1]; //最后一项                    if (post_data != "")                    {                        string[] post_datas = post_data.Split(&);                        foreach (string s in post_datas)                        {                            param.Add(s.Split(=)[0],s.Split(=)[1]);                        }                    }                }            }            return param;        }        static byte[] pageHandle(string pagePath)        {            byte[] pageContent = null;            webroot = webroot.TrimEnd(/,\);            pagePath = pagePath.TrimEnd(/,\);            if (pagePath.Length==0)            {                foreach (string page in defaultPage.Split(,))                {                    if (System.IO.file.Exists(webroot + page))                    {                        pagePath = page;                        break;                    }                }            }            if (System.IO.file.Exists(webroot + pagePath))                pageContent = System.IO.file.ReadAllBytes(webroot + pagePath);            if (pageContent == null)            {                string content = notExistPage();                pageContent = EnCoding.UTF8.GetBytes(content);            }            return pageContent;        }        static voID writeLog(string msg)        {            Console.Writeline("  " + msg);        }        static string notExistPage()        {            string cont = @"<!DOCTYPE HTML><HTML>    <head>        <link rel=‘stylesheet‘ type=‘text/CSS‘ href=‘NewErrorPageTemplate.CSS‘ >        <Meta http-equiv=‘Content-Type‘ content=‘text/HTML; charset=UTF-8‘>        <Title>This page can&rsquo;t be displayed</Title>        <script src=‘errorPageStrings.Js‘ language=‘JavaScript‘ type=‘text/JavaScript‘>        </script>        <script src=‘httpErrorPagesScripts.Js‘ language=‘JavaScript‘ type=‘text/JavaScript‘>        </script>    </head>    <body onLoad=‘JavaScript:getInfo();‘>        <div ID=‘contentContainer‘ class=‘mainContent‘>            <div ID=‘mainTitle‘ class=‘Title‘>This page can&rsquo;t be displayed</div>            <div class=‘taskSection‘ ID=‘taskSection‘>                <ul ID=‘cantdisplayTasks‘ class=‘tasks‘>                    <li ID=‘task1-1‘>Make sure the web address <span ID=‘webpage‘ class=‘webpageURL‘></span>is correct.</li>                    <li ID=‘task1-2‘>Look for the page with your search engine.</li>                    <li ID=‘task1-3‘>Refresh the page in a few minutes.</li>                </ul>                <ul ID=‘notConnectedTasks‘ class=‘tasks‘ style=‘display:none‘>                    <li ID=‘task2-1‘>Check that all network cables are plugged in.</li>                    <li ID=‘task2-2‘>Verify that airplane mode is turned off.</li>                    <li ID=‘task2-3‘>Make sure your wireless switch is turned on.</li>                    <li ID=‘task2-4‘>See if you can connect to mobile broadband.</li>                    <li ID=‘task2-5‘>Restart your router.</li>                </ul>            </div>            <div><button ID=‘diagnose‘ class=‘diagnosebutton‘ onclick=‘JavaScript:diagnoseConnectionAndRefresh(); return false;‘>Fix connection problems</button></div>        </div>    </body></HTML>";            return cont;        }    }}

 

这个web server的雏形就出来了,以后有需要的功能在慢慢往上添加吧

 

 

参考文章:

  自己写的Web服务器 自己写的Web服务器(续)

 

Socket网络编程--简单Web服务器各章节传送门

    Socket网络编程--简单Web服务器(1)  http://www.cnblogs.com/wunaozai/p/3926033.html
    Socket网络编程--简单Web服务器(2)  http://www.cnblogs.com/wunaozai/p/3936295.html
    Socket网络编程--简单Web服务器(3)  http://www.cnblogs.com/wunaozai/p/3943952.html
    Socket网络编程--简单Web服务器(4)  http://www.cnblogs.com/wunaozai/p/3945218.html
    Socket网络编程--简单Web服务器(5)  @L_502_11@
    Socket网络编程--简单Web服务器(6)  http://www.cnblogs.com/wunaozai/p/3949324.html
    源码下载: http://files.cnblogs.com/wunaozai/WebServer.zip

 

时间:2019-09-25 14:27:03 阅读(14) 总结

以上是内存溢出为你收集整理的C#中使用Socket实现简单Web服务器全部内容,希望文章能够帮你解决C#中使用Socket实现简单Web服务器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1214317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存