• socket手写一个简单的web服务端


    直接进入正题吧,下面的代码都是我在pycharm中写好,再粘贴上来的

    import socket
    
    server = socket.socket()
    
    server.bind(('127.0.0.1', 8080))  # 注意bind是server的一个方法,规定传两个参数,一个是它基本本身,另一个
    # 就是ip端口地址,所以我们用元组的方式传参
    
    server.listen(5)  # 设置监听数,同一时刻,最多与五个客户端进行通信
    
    print('正在监听8080端口.......')
    while True:
        conn, address = server.accept()  # 有客户端连接才会执行到这里,并且返回两个参数,一个是跟改客户端进行通信的套接字,一个是该客户端的ip地址
        data = conn.recv(1024)
    
        print(data)  # 这里我们先打印下客户端到底给我们传来了什么数据
    
        conn.send(b'hello word')  # 接收到数据,我们也向web页面返回一个信息,
    
        conn.close()  # 关闭套接字
        # 记住一点,socket,他们之间发送的数据都是二进制的格式
    # 下面是我print(data)的打印效果,我做了适当的换行操作,因为
    就是换行嘛,这就是通过浏览器访问我写的服务端带来的数据
    # 我就在下面代码写写自己注释了。
    # 不知道你们跟着写了没有,但是我这里通过火狐,IE浏览器访问,页面内容是hello word,谷歌浏览器的页面不能解析b'hello word'
    # 出现这样的情况,肯定是火狐,IE浏览器它内部给你封装了,所以页面能显示hello word # 按理说,浏览器向服务端按着某种格式发送(也就是下面这段),服务端应该也要发送某种格式的信息给浏览器,这样才浏览器才能解释。 ''' GET / HTTP/1.1 #这是请求首行 请求方式 url http协议版本号 #这就是请求首行的内容,注意有空格,必须要有空格。 记得换行就行了 Host: 127.0.0.1:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 ' #这上面的就是请求头,key:value ............ #如果是post方法去请求的话,....的位置就是请求体了,我举得例子是get请求,所以就没有请求体, 但是请求体是有的。 '''
    # 那么服务端应该以那种格式,响应回浏览器呢?
    
    'HTTP/1.1 200 ok
    
    你要响应过去的数据'
    
    # 上面的格式中 200是状态码,ok就是状态码的原因短语,两个换行符下面就是响应体了
    # 所以我直接接着while循环那里更改
    
    while True:
        conn, address = server.accept()
        data = conn.recv(1024)
        conn.send(b'HTTP/1.1 200 ok
    
    hello word')
        conn.close()
    '''
    思考拓展:首先我们可以通过浏览器带来请求的数据中,找到它指定的url(这个信息就在请求首行中),
    我们可以通过字符串的一些方法,拿到,再进行判断,如果是index就返回index的页面,也就是根据
    相应的url,我们返回相应的网站。
    说到网站,我们怎么将网站返回过去呢?首先在你的服务端机器上必须要有这个网页,我们可以通过文
    件的读取,将内容通过二进制返回过去。
    既然说了,那下面我就写写,还是接着最开始while循环开始
    '''
    
    while True:
        conn, address = server.accept()
        data = conn.recv(1024)
        conn.send(b'HTTP/1.1 200 ok
    
    ')
        data = str(data, encoding='utf-8')  # 为什么这样操作,之前写了
        url = data.split('
    ')[0].split(' ')[1]  # data数据上面有,通过这样我们找到url
        info = None
        if url == '/index':
            with open('index.html', 'rb') as f:
                info = f.read()
        else:
            info = b'404'
        conn.send(info)
        conn.close()
    
        # 注意了没有,上面代码我写了两句conn.send,这样写也是可以的,因为tcp是流式协议。
        # 我就写了一个逻辑操作,方法就是这样,会了的话,自己再多添几个就行了,但是必须你本地要有该网页
  • 相关阅读:
    2019.9.5 Balanced Lineup
    0060-最小的四位数
    0059-乘积问题
    0058-简单的阶乘
    0057-简单的累加
    0056-简单的博弈
    神奇代码
    测评结果大百科
    0055-空气质量检测
    0054-软件版本号问题
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/9896673.html
Copyright © 2020-2023  润新知