本文要写的内容也称为Python套接字编程,并简单介绍socketserver类。参考教程主要是《Python核心编程》。

首先,客户端/服务器模型,客户端向服务器发送请求,在请求合理的情况下,服务器返回客户端需要的资源,这是此架构下的通信方式。

套接字:套接字是计算机网络的数据结构,体现了通信端点的概念。在开始任何类型的通信之前,网络应用必须创建套接字。可以将套接字比作电话插口,没有它将无法进行通信。AF_INET 网络套接字 是目前使用最广泛的套接字。

套接字地址:一个网络地址由主机-端口 对来组成;可以将套接字比作电话插口,那么主机名和 端口号就像是区号与电话号码的组合。

PS:有效端口号范围为0~65535,小于1024的端口号预留给了系统。

套接字分为面向连接的套接字和无连接的套接字

面向连接的通信提供序列化的,可靠的和不重复的数据交付,而没有边界记录,这基本上意味着每条消息可以拆分成很多片段,并且每一条消息片段都确保能够达到目的地,然后将它们按顺序组合在一起,最后加将完整消息传递给正在等待的应用程序。

实现这种连接类型的主要协议是传输控制协议 TCP。创建TCP套接字,必须使用SOCK_STREAM作为套接字类型。

实例:

创建TCP服务器伪代码如下:

sock = socket() #创建套接字

sock.bind() #将套接字与地址绑定

sock.listen() #监听连接

loop: #服务器无限循环

csock = sock.accept() #接受客户端连接

loop: #通信循环

cs.recv()/cs.send() #接收发送数据

cs.close() #关闭客户端套接字

ss.close() #关闭服务器套接字

服务器示例代码如下:

客户端代码示例如下:

无连接套接字是数据报类型的套接字,这意味着,在通信开始之前不需要建立连接。所以,在数据传输过程中并无法保证它的顺序性,可靠性或重复性,而且还可能丢失信息。但它的优势也是明显的,比如开销小,“成本低廉”。实现这种无连接类型的主要协议是用户数据报协议UDP。必须使用SOCK_DGRAM作为套接字类型

创建UDP服务器的伪代码如下:

sock.socket() #创建通信套接字

sock.bind() #将套接字与地址绑定

loop: #服务器无限循环

csock = sock.recvfrom()/sock.sendto() #接收发送数据

sock.close() #关闭服务器套接字

示例代码如下:

socketserver模块简单介绍

这个模块的不同之处在于,我们使用类来编写应用程序。因为以面向对象的方式处理事物有助于组织数据,以及逻辑性地将功能放在正确的地方。应用程序是事件驱动的,这意味着只有在系统中的事件发生时,它们才会工作。

socketserver模块有4个具体的类

class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True):使用TCP协议

class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True):使用UDP协议

class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True):只使用在UNIX平台上

class socketserver.UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True):只使用在UNIX平台上

这4个类的继承关系如下:

这四个类是同步处理请求的,每一个请求必须在前一个请求完成后再开始。所以如果每个请求都花费大量的时间的话,因为需要进行大量计算,那么它们是不合适的。解决方案就是创建一个分开的进程或者线程去处理每个请求,ForkingMixIn和ThreadingMixIn混入类可以用作支持异步行为。

创建一个服务器需要以下几步,首先,必须创建一个请求处理request handler类通过继承BaseRequestHandler类并且重写handler()方法。该方法将会处理进来的请求,第二步,必须继承server类中的一个,并且将它和request handler类一起传递到服务器地址。然后调用服务器的handle_request()或者serve_forever()方法去处理一个或多个请求。最后调用server_close()关掉套接字

socketserver.BaseServer类是此模块中服务器对象的超类,本身并不直接生成实例,而是通过派生关系,让子类生产实例,它的子类,比如TCPServer,UDPServer。

请求处理对象

socketserver.BaseQequestHandler是超类,每个子类都必须定义一个新的handle()方法,它的两个子类,StreamQequestHandler和DatagramQequestHandler.

示例代码也就是python docs上的代码:

需要注意的是,此片文章中,tcp的代码调试通过了,udp和socketserver的代码调试未通过,后续再努力

python网络编程内容_Python网络编程相关推荐

  1. python网络编程项目_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  2. python网络编程项目_Python网络编程攻略

    第1章套接字.IPv4和简单的客户端/服务器编程 本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字节序之 ...

  3. unet网络python代码详解_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  4. python网络编程自学_Python网络编程学习_Day11

    一.协程 1.理论知识 协程,又称伪线程,是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈. ...

  5. python sub 不区分大小写_Python网络爬虫入门篇

    1. 预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. Python入门篇:https://www.cnblo ...

  6. python核心编程电子书_Python核心编程 PDF 超清第3版

    给大家带来的一篇关于Python编程相关的电子书资源,介绍了关于Python编程.Python核心编程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小22.4 MB,卫斯理编写,目前豆瓣 ...

  7. python开发网络小工具_python 网络工具

    书籍:掌握Python的网络和安全 Mastering Python for Networking and Security - 2018.pdf 简介 掌握Python的网络和安全 掌握Python ...

  8. python网络爬虫应用_python网络爬虫应用实战

    原标题:python网络爬虫应用实战 Python这门编程语言包罗万象,可以说掌握了python,除了一些特殊环境和高度的性能要求,你可以用它做任何事. Python作为一门脚本语言,它灵活.易用.易 ...

  9. python交互界面实例_Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后, ...

最新文章

  1. oracle创建用户、授予权限及删除用户
  2. 为什么hive需要mysql作为数据库_Hive安装(本地独立模式,MySql为元数据库)
  3. PyCharm调试错误
  4. 4.4.5 清除变量内容
  5. 单用户修改root密码--centos6.2
  6. 祁是计算机,南京邮电大学计算机/软件学院导师介绍:祁正华
  7. centos7 安装mysql8_CentOS7中安装MySQL8.0.21爬坑记录
  8. 【lucene】入门级
  9. BZOJ3669[NOI2014] 魔法森林
  10. 单维度量表验证性因子分析_验证性因素分析介绍
  11. Python之温度换算
  12. 怎么用u盘重装系统?石大师u盘重装win10系统步骤
  13. 计算机网络连接显示678是什么意思,WinXP宽带连接提示错误代码678怎么办?
  14. Linux应用编程-音频应用编程-语音转文字项目
  15. Spring报错:Exception encountered during context initialization - cancelling refresh attempt: org.sprin
  16. DOM DOM概述
  17. oracle使用哈希算法,ORA_HASH函数使用的算法是什么?
  18. 高校车辆管理系统/车辆管理系统的设计与实现
  19. c++用宏定义和函数来求圆的面积,半径可为表达式
  20. anki 插入表格_【anki|批量制作选择题的另一种思路】- 一点资讯(Yidianzixun.com)

热门文章

  1. 01.轮播图之三 : collectionView 轮播
  2. autotools入门笔记(二)——创建和使用静态库、动态库
  3. Redis源码分析之工具类util
  4. 每日一题(16)—— 声明和定义的区别
  5. TQ210 —— NandFlash
  6. 语音处理入门——语音的声学处理
  7. 利用qsort二级排序
  8. python调用arcgis_arcgis python 调用工具两种两种方法
  9. nedc工况_东南DX3 EV续航升级 NEDC综合工况续航451公里
  10. Redis常见数据类型_Redis通用指令