设为首页 收藏本站
查看: 1324|回复: 0

[经验分享] 通过一个小程序,说明IIS不神秘

[复制链接]

尚未签到

发表于 2015-8-12 11:00:58 | 显示全部楼层 |阅读模式
  构想,这个只是构想而已:自己做一个IIS。
  IIS是什么呢?一个霸占者80或者443端口的程序。
  所有对于80端口的请求,不管是GET还是POST或者其他符合HTTP1.1的东西,都交给它来处理了。
  通过浏览器,我们请求一个页面,然后,我们的请求就被它获得了。我们看看,它拿到的HTTP请求数据头是什么东西。
  新建一个VBNET的控制台程序,我们也来霸占一个端口 13000



Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports Microsoft.VisualBasic
Module Module1
    Public Sub Main()
        Dim server As TcpListener
        server = Nothing
        Try
            ' Set the TcpListener on port 13000.
            Dim port As Int32 = 13000
            Dim localAddr As IPAddress = IPAddress.Parse("127.0.0.1")
            server = New TcpListener(localAddr, port)
            ' Start listening for client requests.
            server.Start()
            ' Buffer for reading data
            Dim bytes(1024) As Byte
            Dim data As String = Nothing
            ' Enter the listening loop.
            While True
                Console.Write("Waiting for a connection... ")
                ' Perform a blocking call to accept requests.
                ' You could also user server.AcceptSocket() here.
                Dim client As TcpClient = server.AcceptTcpClient()
                Console.WriteLine("Connected!")
                data = Nothing
                ' Get a stream object for reading and writing
                Dim stream As NetworkStream = client.GetStream()
                Dim i As Int32
                ' Loop to receive all the data sent by the client.
                i = stream.Read(bytes, 0, bytes.Length)
                While (i <> 0)
                    ' Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
                    Console.WriteLine("Received: {0}", data)
                    ' Process the data sent by the client.
                    data = data.ToUpper()
                    Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
                    ' Send back a response.
                    stream.Write(msg, 0, msg.Length)
                    Console.WriteLine("Sent: {0}", data)
                    i = stream.Read(bytes, 0, bytes.Length)
                End While
                ' Shutdown and end connection
                client.Close()
            End While
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        Finally
            server.Stop()
        End Try
        Console.WriteLine(ControlChars.Cr + "Hit enter to continue....")
        Console.Read()
    End Sub 'Main
End Module  启动这个程序,然后找个浏览器,在地址栏输入  
http://localhost:13000/你的浏览器什么现在都没有显示【过一会改一下代码就会好的,别急】。

  看看控制台输出了什么。前面一半是截获到的浏览器发出的请求。后面一半是我们返回给浏览器的东西【就是把请求转为大写,当然浏览器不知道怎么办了】。这个请求的HTTP数据头,网上资料一大把。
  

  OK,现在我们修改一下程序,还给浏览器一些它想要的东西,就是HTTP返回的数据头。


1                     ' Process the data sent by the client.
2                     data = "HTTP/1.1 200 OK" & vbCrLf
3                     data += "Content-Length: 37" & vbCrLf & vbCrLf
4                     data += "<HTML><BODY>Hello World</BODY></HTML>"  第二行,我们返回200,表示请求处理成功
  第三行,我们告诉浏览器正式数据的长度,并且加入一个空行,表示数据头和数据的区分。
  第四行,就是我们的HTML了。
  重复运行一下程序:再浏览器里面输入
  
http://localhost:13000/
  现在就有HelloWorld了吧。
  其实IIS干的事情就和这个小程序差不多。霸占80端口,等着请求(Request,GET/POST),请求来了,解析一下,找个合适的同志来处理请求(ASPNET),处理好的请求的结果(response),还给浏览器。

  各位看了这个例子之后,就知道IIS做的事情,也不是很神秘吧。

  
  实际上IIS还要管理Session(可能通过Cookies来实现)调度任务 等等。不过机理还是围绕着HTTP1.1协议来展开的。希望大家知道IIS的大概工作原理,不要觉得IIS是一个小黑屋。输入一个网址到浏览器,获得一个HTML的页面,其实很简单。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97853-1-1.html 上篇帖子: WCF宿主-IIS 下篇帖子: 深入理解IIS的多线程工作机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表