Python 套接字socketserver网络编程
为什么使用socketserver
虽然Python内置的socket和threading模块能实现简单的多线程服务器,在非正式环境,随便用用还是可以的,但是如果要在生产环境中使用,那是万万不够的。
Python考虑得很周到,为了满足我们对多线程网络服务器的需求,提供了"socketserver"模块。socketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端。每个客户端请求连接到服务器时,socketserver服务端都会创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。
使用socketserver要点
- 创建一个server类,继承"socketserver.BaseRequestHandler";
- 这个类中必须重写一个名字为"handle"的方法,不能是别的名字,在此进行业务逻辑处理(比如收发数据等);
- 将这个新建的类,连同服务器的IP和端口作为参数传递给"ThreadingTCPServer()"实例化;
- 启动"ThreadingTCPServerObj.serve_forever()"。
栗子
服务端
import socketserver # 1.必须继承socketserver.BaseRequestHandler类,后台自动建立双工通信,等待客户端连接
class MySockServer(socketserver.BaseRequestHandler):
def handle(self):
# .进行收发数据
# request对象进行接收和发送数据
request = self.request
request.send('欢迎访问socketserver服务器'.encode()) # 发送数据send()
while True:
data = request.recv(1024).decode() # 接收数据recv()
if data == 'exit':
print('断开与%s的连接!' % (self.client_address,))
break
elif data:
print('来自%s客户端向你发来数据:%s' % (self.client_address, data))
request.send('服务器已收到数据'.encode()) # 发送数据 if __name__ == '__main__':
# 3.创建一个多线程TCP服务器对象,绑定IP和端口
tcp_server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MySockServer)
print('启动服务器!')
# 4.启动服务器,服务器将一直保持运行状态
tcp_server.serve_forever()
分析一下服务器端的代码,核心要点有这些:
- 连接数据封装在"self.request"属性中!通过"self.request"对象调用"send()"和"recv()"方法。
- "handle()"方法是整个通信的处理核心(业务逻辑处理,如收发数据等),一旦它运行结束,当前连接也就断开了(但其他的线程和客户端还正常),因此一般在此设置一个无限循环。
- 注意"sock_server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MySockServer)"中参数传递的方法。
- "sock_server.serve_forever()"表示该服务器在正常情况下将永远运行。
客户端
import socket
# 客户端依然使用socket模块就可以了,不需要导入socketserver模块
IP_PORT = ('127.0.0.1', 8888)
# 1.创建socket对象
sock = socket.socket()
# 2.与服务端连接,建立双工通信
sock.connect(IP_PORT)
sock.settimeout(0.5)
# 3.进行收发数据
data = sock.recv(1024).decode() # 接收数据recv()
print('接收返回数据:%s' % data)
while True:
inp = input('输入要发送的数据:').strip()
if not inp:
continue
sock.send(inp.encode()) # 发送数据send()
if inp == 'exit':
print('谢谢使用,再见!')
break
data = sock.recv(1024).decode()
print('接收返回数据:%s' % data)
# 4.断开连接
sock.close()
客户端的代码很好理解,依然使用socket模块就可以了,不需要导入socketserver模块。
至此,转载请注明出处。

Python 套接字socketserver网络编程的更多相关文章
- Python中利用原始套接字进行网络编程的示例
Python中利用原始套接字进行网络编程的示例 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构 ...
- 基于TCP的socket套接字的网络编程(客户端/服务端模式)
于数据完整性要求较高的场合,就应采用TCP协议. IP网络层提供IP寻址和路由.因为在网络上数据可以经由多条线路到达目的地,网络层负责找出最佳的传输线路. IP地址与数据包: IP层就是把数据分组从一 ...
- Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 1. socket模块与基本套接字编程 2. socket模块的其他网络编程功能 3. SocketServer模块与简单并发服务器 4. 异步编程 ...
- python套接字编程基础
python套接字编程 目录 socket是什么 套接字的工作流程 基于tcp的套接字 基于udp的套接字 socket是什么 客户端/服务器架构(C/S架构) 服务端:提供服务的一端 客户端:请求服 ...
- python套接字编程实现ntp服务和远程命令执行
python套接字编程实现ntp服务和远程命令执行 目录 基于udp实现ntp服务 基于tcp实现远程命令执行 基于udp实现远程命令执行 tcp与udp的比较 前面关于套接字基础请查阅 https: ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python基础教程总结13——网络编程,
1.网络设计模块 1.1 socket模块 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. 1)服务器监听:是服务器端套接 ...
- 吴裕雄--天生自然python学习笔记:Python3 网络编程
Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络 ...
- python套接字基本使用
socket socket通常也称作"套接字",用于描述IP地址和端口,应用程序通常通过"套接字"向网络发出请求或者应答网络请求,可以认为是一种计算机网络的数据 ...
随机推荐
- JavaScript优化细节(一)
1.置空Closure(闭包)引起的Memory leak滞留的Object和domain 2.用fragment实现append大量元素 var f= document.createDocument ...
- IdentityServer(13)- 使用 JavaScript 客户端
本文使用的授权码模式,已更新至 .NET Core 2.2 本快速入门将展示如何构建基于浏览器的 JavaScript 客户端应用程序(SPA). 用户将登录 IdentityServer,使用 Id ...
- Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
1. 输出重定向 最基本的重定向是将命令的输出发送到一个文件中.在bash shell中用大于号(>) ,格式如下:command > inputfile.例如:将date命令的输出内容, ...
- Linux编程 21 shell编程(环境变量,用户变量,命令替换)
一.概述 这篇介绍shell的变量使用,跟其实语言一样,都有声明变量,使用变量,在shell中变量允许你临时地将信息存储中shell脚本中,以便和脚本的其他命令一起使用. 1.1 环境变量 在前面章节 ...
- Android--多线程之进程与线程
前言 对于Android程序中,使用多线程的技术是必不可少的,就拿之前最简单的例子来说明,对于Android4.0+的应用而言,访问网络必须另起线程才可以访问.本片博客介绍Android下进程和线程, ...
- 大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- 对requestAnimationFrame的一点理解
假设一个web页面为60fps(fps意为frame per second),这意为着这个页面每秒钟能重新渲染60次,60帧/1000ms换算过来约为16.6ms/帧. requestAnimatio ...
- MFC控件编程之组合框跟列表框
MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...
- Linux下FTP虚拟账号环境部署总结
vsftp的用户有三种类型:匿名用户.系统用户.虚拟用户.1)匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous.2)本地用户登录:使用系统用户登录,在/etc/passwd中 ...
- thinkphp自动填充分析
thinkphp有一个自动填充字段的方法填充规则如下 array( array(完成字段1,完成规则,[完成条件,附加规则]), array(完成字段2,完成规则,[完成条件,附加规则]), .... ...