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中的with语句与上下文管理器学习总结
Jun 28 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
实例讲解python中的序列化知识点
Oct 08 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
详解python中递归函数
Apr 16 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
基于Python实现流星雨效果的绘制
Mar 18 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
咖啡的化学
2021/03/03 咖啡文化
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
vue组件实例解析
2017/01/10 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
小程序实现tab标签页
2020/11/16 Javascript
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python调用摄像头显示图像的实例
2018/08/03 Python
Python版名片管理系统
2018/11/30 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
社区党建工作汇报材料
2014/10/27 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Python实现照片卡通化
2021/12/06 Python
MySQL Server层四个日志的实现
2022/03/31 MySQL
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript