python网络编程-socketserver模块
使用socketserver
- 老规矩,先引入
import socketserver
- 必须创建一个类,且继承
socketserver.BaseRequestHandler
- 这个类中必须重写
handle(self)
函数负责和客户端进行交互,所以的交互都写这里面 - 可以重写的方法
#socketserver.BaseRequestHandler 类
def setup(self):#请求进来之前的操作
pass
def handle(self):#处理请求的操作
pass
def finish(self):#请求结束后的后事
pass
我的客户端和服务端例子
- 服务端
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
#print(self.__dict__)#查看继承类中的属性和方法
#print(self.server.__dict__)#查看ThreadingTCPServer中的属性和方法
while True:
try:
data = self.request.recv(1024)
#self.request.recv
print('收到命令:', data.decode())
cmd = data.decode()
# if not data:#socket中判断客户端是否断开的方法
# print('客户端已断开')
# break
cmd_res = os.popen(cmd).read()
if len(cmd_res) == 0:
cmd_res = 'has not this command...'
# 先发送结果长度给客户端判断
res_size = len(cmd_res.encode())
self.request.send(str(res_size).encode('utf-8'))
client_ack = self.request.recv(1024) # 为防止粘包发生,这里给客户端在接收到数据大小后,发送一个消息给服务端确认
print(client_ack.decode())
self.request.send(cmd_res.encode('utf-8'))
except ConnectionResetError as e:#在socketserver模块中,捕获ConnectionResetError判断客户端是否断开
print('连接断开:',e)
break
if __name__ == "__main__":
HOST, PORT = "localhost", 6512
# Create the server, binding to localhost on port 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)#多线程
#server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler)#多进程,windows无法使用,linux适用
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
- 客户端
import socket
client = socket.socket()
client.connect(('localhost',6512))
while True:
cmd = input('>>:')
if len(cmd) == 0 : continue
client.send(cmd.encode('utf-8'))
cmd_res_size = client.recv(1024)#接收结果长度
client.send('数据大小已收到,准备接收数据'.encode('utf-8'))#告诉服务器可以发送数据结果
recv_size = 0
cmd_res = b''
while recv_size < int(cmd_res_size.decode()):
data = client.recv(1024)
recv_size += len(data)
cmd_res += data
else:
print(cmd_res.decode())
print('res is end...')
client.close()
父类socketserver.BaseRequestHandler中的__dict__
{
'request': <socket.socketfd=296,
family=AddressFamily.AF_INET,#地址簇
type=SocketKind.SOCK_STREAM,#socket类型
proto=0,
laddr=('127.0.0.1',
6512),#服务端地址和端口
raddr=('127.0.0.1',
53668)>,#客户端地址和端口
'client_address': ('127.0.0.1',
53668),#客户端地址和端口
'server': <socketserver.ThreadingTCPServerobjectat0x0000000001EC8AC8>
}
ThreadingTCPServer类中的__dict__
{
'server_address': ('127.0.0.1',
6512),
'RequestHandlerClass': <class'__main__.MyTCPHandler'>,
'_BaseServer__is_shut_down': <threading.Eventobjectat0x0000000001EC8940>,
'_BaseServer__shutdown_request': False,
'socket': <socket.socketfd=200,
family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM,
proto=0,
laddr=('127.0.0.1',
6512)>
}
RequestHandlerClass:
{
'__module__': '__main__',
'handle': <functionMyTCPHandler.handleat0x0000000001ED31E0>,#指向我们自己定义的类
'__doc__': None
}
_BaseServer__is_shut_down:
{
'_cond': <Condition(<unlocked_thread.lockobjectat0x0000000001E8D918>,
0)>,
'_flag': False
}
python网络编程-socketserver模块的更多相关文章
- python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- python网络编程——SocketServer/Twisted/paramiko模块
在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...
- (网络编程)socketserver模块服务端实现并发
基于tcp的套接字(实现并发),关键就是两个循环,一个链接循环,一个通信循环 基于udp的套接字(不是正真意义上的并发,实现真并发) socketserver模块中分两大类:server类(解决链接问 ...
- python 网络编程--socket模块/struct模块
socket模块: 客户端:CS架构, client -> server 浏览器:BS架构, browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...
- 网络编程------socketserver模块以及socket模块的更多用法.
socketserver模块 内置模块 (其实现原理为并发) socketserver这个模块主要是为了解决: TCP协议中,服务器不能同时连接多个客户端的问题 是处于socket抽象层和应用层之间的 ...
- python网络编程--socketserver 和 ftp功能简单说明
1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...
- python网络编程-socketserver
一:socketserver简化了网络服务器的编写. 它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer. 这4个类是同步进行处 ...
- python 网络编程(socketserver,阻塞,其他方法)
重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...
- python网络编程----requests模块
python访问网站可以用标准模块--urllib模块(这里省略),和requests(安装-pip install requests)模块,requests模块是在urllib的基础上进行的封装,比 ...
随机推荐
- js 遍历tree的一个例子(全遍历),更复杂的功能
更复杂的功能 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 2017年6月15日 由一个freemarker出错引发的感想
今天想要实现一个功能,想要实现遍历多个checkbox的功能.想出一个解决方法用了30秒钟,将包含的键值put进map中,前台根据map[key]??判断是否具有该值,乍一看这个方法很好,可是实际上问 ...
- 奇妙的 clip-path 几何图形
CSS 新属性 clip-path,意味裁剪路径的意思,让我们可以很便捷的生成各种几何图形. clip-path 通过定义特殊的路径,实现我们想要的图形.而这个路径,正是 SVG 中的 path . ...
- Kibana6.x.x——启动后的一些警告信息记录以及解决方法
1.发现的第一个警告信息 server log [06:55:25.594] [warning][reporting] Generating a random key for xpack.report ...
- hdu1686 KMP 求在字符串A中字符串B出现的次数
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Gone Fishing
原题网址 代码已经写出来了,自己测试的时候没有问题,提交上去之后反馈了我一个Runtime error 一口老血啊! 找了半天还是没找到可能越界啊啥的地方 import java.util.Scan ...
- 2.centos7 安装Mesos和marathon
master节点 节点名称 IP地址 master1 192.168.161.128 由于硬件资源有限,这里仅安装一个master节点,会存在单点问题.在实际生产中,尽量不要这样操作. 1.安装zoo ...
- thinkPHP5.0获取器
获取器的作用是在获取数据的字段值后自动进行处理,例如,我们需要对状态值进行转换,可以使用: class Cate extends Model { public function getTypeAttr ...
- Java日志组件1---Jdk自带Logger(java.util.logging.Logger)
最近在看日志的一些东西,发现利用JDK自带的log也可以简单的实现日志的输出,将日志写入文件的过程记录如下: 1.新建LogUtil.Java( 里面写了几个静态方法,为log设置等级.添加log控制 ...
- https Android 5.0 以下TLS 版本过低造成的问题
异常如下 javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ...