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 os模块介绍
Nov 30 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
详解Python中for循环是如何工作的
Jun 30 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
python直接获取API传递回来的参数方法
Dec 17 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
python标准库os库的函数介绍
Feb 12 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
PHP修改session_id示例代码
2014/01/08 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
小学中秋节活动方案
2014/02/06 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
通过Python把学姐照片做成拼图游戏
2022/02/15 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript