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 数据加密代码
Dec 24 Python
pycharm 使用心得(四)显示行号
Jun 05 Python
Python urlopen()函数 示例分享
Jun 12 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
Python rstrip()方法实例详解
Nov 11 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
Django的Modelforms用法简介
Jul 27 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
Python使用20行代码实现微信聊天机器人
Jun 05 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
php单态设计模式(单例模式)实例
2014/11/18 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
jQuery源码分析之Event事件分析
2010/06/07 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
深入解析Python中的集合类型操作符
2015/08/19 Python
Python 操作MySQL详解及实例
2017/04/30 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
会计出纳岗位职责
2013/12/25 职场文书
顶岗实习计划书
2014/01/10 职场文书
汉语言文学职业规划
2014/02/14 职场文书
人事专员职责
2014/02/22 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
文明之星事迹材料
2014/05/09 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
Python 阶乘详解
2021/10/05 Python