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 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
在Django的session中使用User对象的方法
Jul 23 Python
Python设计模式之中介模式简单示例
Jan 09 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
python实现图片批量压缩程序
Jul 23 Python
python 文件查找及内容匹配方法
Oct 25 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
Django项目后台不挂断运行的方法
Aug 31 Python
python实现微信打飞机游戏
Mar 24 Python
Python多线程通信queue队列用法实例分析
Mar 24 Python
Python requests模块安装及使用教程图解
Jun 30 Python
pycharm 添加解释器的方法步骤
Aug 31 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中的Class的几点个人看法
2006/10/09 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
php获取网页请求状态程序示例
2014/06/17 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
jquery 问答知识整理
2010/02/11 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python程序退出方式小结
2017/12/09 Python
Python 私有化操作实例分析
2019/11/21 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
详解Scrapy Redis入门实战
2020/11/18 Python
Python与C/C++的相互调用案例
2021/03/04 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
促销活动总结报告
2014/04/26 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
学生检讨书怎么写
2015/05/07 职场文书
爱护公物主题班会
2015/08/17 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS