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中除法使用的注意事项
Aug 21 Python
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
用不到50行的Python代码构建最小的区块链
Nov 16 Python
python爬取各类文档方法归类汇总
Mar 22 Python
python调用API实现智能回复机器人
Apr 10 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
python中rb含义理解
Jun 18 Python
通过实例解析python创建进程常用方法
Jun 19 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
PHP中文乱码解决方案
2015/03/05 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
分析python切片原理和方法
2017/12/19 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
推荐信模板
2014/05/09 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
MySQL分区以及建索引的方法总结
2022/04/13 MySQL