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的Flask框架下收发电子邮件的教程
Apr 21 Python
python动态参数用法实例分析
May 25 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Python数据类型之Tuple元组实例详解
May 08 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
python实现图片转换成素描和漫画格式
Aug 19 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的ob_start() 控制您的浏览器cache
2009/08/03 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
师德学习感言
2014/01/31 职场文书
什么是就业协议书
2014/04/17 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
委托证明书
2014/09/17 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
开学随笔
2015/08/15 职场文书
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript