python的socket编程入门


Posted in Python onJanuary 29, 2018

Flask或者其他框架都是封装的比较完善,我们可以不去关注路由、SESSION等到底是怎么实现的,现在我们使用socket来实现一个带有注册、登录功能的To do网站,这样能对后端框架了解的稍微更深入一点(当然你也可以直接去看Flask源码)。

主程序runserver.py代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
from exts import Request
from route import response_for_request
from datetime import datetime
def run_server(host='', port=1207):
  # 建立一个socket.socket()类s
  with socket.socket() as s:
    # 设置s在服务端关闭后马上释放端口,避免Address already in use错误
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 绑定host和port
    s.bind((host, port))
    while 1:
      # 开始监听传入连接,可以挂起的最大连接数为5
      s.listen(5)
      # 接受连接,根据buffer_size不断读取内容
      connection, address = s.accept()
      r = ''
      buffer_size = 1024
      while 1:
        data = connection.recv(1024).decode('utf-8')
        r += data
        if len(data) < buffer_size:
          break
      # 防止浏览器传空请求过来
      if len(r.split()) < 2:
        continue
      # 最后取得的r是一个http请求头字符串,对其解析,然后使用sendall返回相应的内容 
      request = Request(r)
      # 每次请求时打印时间,请求的方法和路径
      print(str(datetime.now())[:19], request.method, request.path)
      response = response_for_request(request)
      connection.sendall(response)
      connection.close()
if __name__ == '__main__':
  run_server()

run_server函数代码的简单说明可以看注释;from exts import Request:从exts导入一个Request类,这个Request类是自己编写的,用于解析http请求头,这部分是很简单的,在网上搜索http请求相关内容,就可以自行写一个,包括返回请求头的路径、方法、各个字段以及body部分等,都是字符串相关的操作。

from route import response_for_request:从route.py导入相应函数,即传入一个上一步中的Request类,返回对应的网页内容,具体实现将在后续讲解。

可以说,主程序就已经编写好了,整个逻辑也很简单,使用socket监听连接,解析请求,返回请求对应的内容。后续只要去处理解析请求和响应部分即可,主程序可以不用再修改。

Python 相关文章推荐
python文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
python中迭代器(iterator)用法实例分析
Apr 29 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
python随机数分布random测试
Aug 27 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
kali中python版本的切换方法
Jul 11 Python
Python函数参数定义及传递方式解析
Jun 10 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
为什么相对PHP黑python的更少
Jun 21 Python
Python 错误和异常代码详解
Jan 29 #Python
python实现机器人行走效果
Jan 29 #Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 #Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 #Python
详解Python自建logging模块
Jan 29 #Python
python抓取网页中链接的静态图片
Jan 29 #Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 #Python
You might like
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
python 运算符 供重载参考
2009/06/11 Python
Python中replace方法实例分析
2014/08/20 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
python使用fork实现守护进程的方法
2017/11/16 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python 修改列表中的元素方法
2018/06/26 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
python绘制汉诺塔
2021/03/01 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
企业宣传策划方案
2014/05/29 职场文书
平安工地汇报材料
2014/08/19 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
社区宣传标语口号
2015/12/26 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang