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中使用插入排序算法的简单分析与代码示例
May 04 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
python numpy格式化打印的实例
May 14 Python
python里 super类的工作原理详解
Jun 19 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
python中数据库like模糊查询方式
Mar 02 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
Python unittest生成测试报告过程解析
Sep 08 Python
python获取命令行参数实例方法讲解
Nov 02 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
Smarty中常用变量操作符汇总
2014/10/27 PHP
php文件缓存方法总结
2016/03/16 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
详解Python编程中time模块的使用
2015/11/20 Python
python文件名和文件路径操作实例
2017/09/29 Python
详解python pandas 分组统计的方法
2019/07/30 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
函授教育个人学习的自我评价
2013/12/31 职场文书
电气工程师岗位职责
2014/01/01 职场文书
党组织公开承诺书
2014/03/29 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
音乐之声观后感
2015/06/04 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
css3 选择器
2022/05/11 HTML / CSS