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 random模块(获取随机数)常用方法和使用例子
May 13 Python
Python实现简单的代理服务器
Jul 25 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
python使用selenium实现批量文件下载
Mar 11 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
python tkinter图形界面代码统计工具
Sep 18 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
解决python 读取 log日志的编码问题
Dec 24 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 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使用异或实现的加密解密实例
2013/09/04 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
javascript动画浅析
2012/08/30 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
Python OS模块实例详解
2019/04/15 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
如何在python中执行另一个py文件
2020/04/30 Python
财务会计专业毕业生自荐信
2013/10/02 职场文书
聚美优品的广告词
2014/03/14 职场文书
讲解MySQL增删改操作
2022/05/06 MySQL
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python
JS实现简单的九宫格抽奖
2022/06/28 Javascript