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 文件读写操作实例详解
Mar 12 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
Python编写Windows Service服务程序
Jan 04 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
python for循环输入一个矩阵的实例
Nov 14 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
python输出数学符号实例
May 11 Python
python中什么是面向对象
Jun 11 Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
python实现MD5进行文件去重的示例代码
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
php使用pear_smtp发送邮件
2016/04/15 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
简单易懂的python环境安装教程
2017/07/13 Python
python实现xlsx文件分析详解
2018/01/02 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
纽约手袋品牌:KARA
2018/03/18 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
汽车驾驶求职信
2013/10/25 职场文书
实习报告评语
2014/04/26 职场文书
《包身工》教学反思
2016/02/23 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
Nginx四层负载均衡的配置指南
2021/06/11 Servers
redis lua限流算法实现示例
2022/07/15 Redis