python3的socketserver_Python3 socketserver编程

Python3 socketserver编程

阅读 (86) |

发布于 2020-05-19 14:43:40

上一节中,我们用socket模块实现了简单的c/s通信。但如果有多客户端同时请求服务器连接,就会出现问题。比如客户端A 要通过服务器将消息发给客户端B。这时候就需要A,B同时在线。

socketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端。每个客户端请求连接到服务器时,socketserver服务端都会创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。

socketserver 是标准库中的一个高级模块。它简化了创建网络服务器的代码。让你只关注于你的业务逻辑。通过封装socket, 不需要关心原始服务器循环中阻塞,等待,请求等。让你只需要定义一个处理程序,当服务器有连接或者数据传入时,调用你所定义的方法即可。

创建socketserver TCP 服务器import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler): #服务类,监听绑定等等

"""

必须要继承socketserver.BaseRequestHandler

在此类中需要重写handle()方法,请求的交互在这里执行。

当每次有连接练上来时,会实例化此类, 生成一个实例来处理此连接的相关操作。

"""

def handle(self):

self.data = self.request.recv(1024).strip()

print("receive from {}:".format(self.client_address[0]))

print(self.data)

self.request.sendall(self.data.upper())

if __name__ == "__main__":

HOST, PORT = "localhost", 9999

server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

server.serve_forever()

在上面代码中, 我们用socketserver.TCPServer启动了一个TCP服务器,当有连接过来时,用我们自定义的MyTCPHandler进行处理。而当你真正使用时,会发现当一个客户连接成功以后,如果连接不断开,其他客户端是无法连接的。

现在我们把上面代码稍微的修改一下, 改为多线程的方式:if __name__ == "__main__":

HOST, PORT = "192.168.1.144", 9919

server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)

server.serve_forever()

这样就可以在每个客户端建立连接后,启动一个线程去处理此连接的所有操作。而不会阻塞一直等待上一个客户端断开。

除此之外, socketserver 还提供了多进程的方式。server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler)

总结如下:多进程 server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler) 数据不可共享,彼此独立。

多线程 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) 数据可共享,一般需要线程锁。

单进程 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) 一次只能建立一个连接。

客户端测试实例:#!/usr/bin/env python

import time

import socket

s = socket.socket()

s.connect(('192.168.1.144', 9919))

while True:

s.send(bytes("hello server", encoding='utf-8'))

time.sleep(2)

data = s.recv(512)

data = data.decode('utf-8')

print('data:', data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值