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解析json实例方法
Nov 19 Python
python发布模块的步骤分享
Feb 21 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
解决python Markdown模块乱码的问题
Feb 14 Python
Python TestCase中的断言方法介绍
May 02 Python
python调用动态链接库的基本过程详解
Jun 19 Python
Python求均值,方差,标准差的实例
Jun 29 Python
对Python _取log的几种方式小结
Jul 25 Python
python+rsync精确同步指定格式文件
Aug 29 Python
Python操作Excel把数据分给sheet
May 20 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 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
提问的智慧
2006/10/09 PHP
phpmyadmin操作流程
2006/10/09 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
js select常用操作控制代码
2010/03/16 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
JS数组方法join()用法实例分析
2020/01/18 Javascript
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物