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列表去重的二种方法
Feb 14 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
Python求解正态分布置信区间教程
Nov 20 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
Python二次规划和线性规划使用实例
Dec 09 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
Python析构函数__del__定义原理解析
Nov 20 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的栏目导航程序
2006/10/09 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
利用python实现AR教程
2019/11/20 Python
python数据爬下来保存的位置
2020/02/17 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
HTML5实现预览本地图片
2016/02/17 HTML / CSS
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
七一党日活动总结
2014/07/08 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
工地材料员岗位职责
2015/04/11 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫