python socket框架_基于python socketserver框架全面解析

socketserver框架是一个基本的socket服务器端框架, 使用了threading来处理多个客户端的连接, 使用seletor模块来处理高并发访问, 是值得一看的python 标准库的源码之一

对于select网络框架的理解可以看 << 基于python select.select模块通信的实例讲解 >>。socketserver框架采用了selector框架来供你选择相适应的网络通信框架, 比如select, poll, epoll等。有了这些网络框架我们就能处理高并发的网络访问了.

先看看示例代码吧:

# coding: utf-8

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):

"""

The request handler class for our server.

It is instantiated once per connection to the server, and must

override the handle() method to implement communication to the

client.

"""

def handle(self):

# self.request is the TCP socket connected to the client

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

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

print(self.data)

# just send back the same data, but upper-cased

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

if __name__ == "__main__":

HOST, PORT = "localhost", 9999

# Create the server, binding to localhost on port 9999

# 如果子类没有某个方法或是属性, 就回去父类中调用

with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server:

# Activate the server; this will keep running until you

# interrupt the program with Ctrl-C

server.serve_forever()

客户端:

# coding: utf-8

import socket

sk = socket.socket()

sk.connect(("127.0.0.1", 9999)) # 主动初始化与服务器端的连接

while True:

send_data = input("输入发送内容:")

sk.sendall(bytes(send_data, encoding="utf8"))

if send_data == "byebye":

break

accept_data = str(sk.recv(1024), encoding="utf8")

print("".join(("接收内容:", accept_data)))

sk.close()

我们创建一个继承自BaseRequestHandler类的TCP请求处理类, 说白了这个类就是我们自己封装的基于socket的recv()函数与send()函数的类, 而所谓的TCP请求处理类其实就是对socket服务器端的bind, listen, accept等处理的封装类, 而且这个封装的并不是简单的socket, 而是基于select或是epoll等网络框架的类, 我们调用这个类就能轻易地处理高并发的网络访问. 其实认真阅读源码, 你会发现整体的程序设计是基于事件驱动的, 事件驱动机制的三个要素: 消息(事件)队列, 消息(事件)触发, 事件循环。只不过socketserver框架的事件驱动机制就做到了socket的accept()方法那, 接下来的消息接受(recv)与发送(send)就没有在做封装成相应的事件来进行处理了。

在这里说一个要注意的地方, 我使用了ThreadingTCPServer()类响应多个客户端的连接, 但是当我阅读这个类的源码的时候, 表示很疑惑啊!

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

这让我很疑惑啊,再看看调用:

with socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) as server:

# Activate the server; this will keep running until you

# interrupt the program with Ctrl-C

server.serve_forever()

这更疑惑, ThreadingTCPServer哪来的构造函数, 后来研究了一下, 原来当子类的某个函数或是属性发生调用时, 如果不是重载了父类的方法或是属性, 而且子类中没有这个方法或是属性, 就会去调用父类相对应的方法或是属性, 于是上面的就是调用了TCPServer的初始化函数__init__以及serve_forever(), 随后调用的是子类的Request_handler函数

程序结果:

201709210822289.jpg

2017092108222810.jpg

以上这篇基于python socketserver框架全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonsocket通信是一种用于实现网络通信的方法。通过使用socket库,可以在不同的计算机之间建立起连接,实现数据的传输和交互。在Python中,socket通信可以用于实现不同进程或不同计算机之间的通信。 在给出的引用中,有几个不同的例子展示了Pythonsocket通信的不同方式。 第一个例子是一个并发聊天的例子。其中包括一个服务端和一个客户端,通过创建一个服务器和多个客户端,实现了多个用户之间的实时聊天。在服务端中,通过使用socketserver库的BaseRequestHandler类,对客户端的请求进行处理。而在客户端中,通过创建一个socket对象,并通过connect方法连接到服务器端。 第二个例子是一个简单的并发通信例子。类似于第一个例子,它也包括一个服务端和一个客户端。在服务端中,通过创建一个服务器对象并监听指定的IP地址和端口号,等待客户端的连接。然后通过接收和发送数据来实现与客户端的通信。在客户端中,通过创建一个socket对象,并通过connect方法连接到服务器端,然后通过发送和接收数据来实现与服务器端的通信。 第三个例子是一个基础样例。它展示了一个简单的服务器和一个客户端之间的通信。在服务器端,通过创建一个socket对象,并通过bind方法绑定指定的IP地址和端口号。然后通过listen方法监听连接请求,并通过accept方法接受客户端的连接。然后通过接收和发送数据来实现与客户端的通信。在客户端中,通过创建一个socket对象,并通过connect方法连接到服务器端,然后通过发送和接收数据来实现与服务器端的通信。 总结来说,Pythonsocket通信可以通过创建socket对象,并调用相应的方法来实现与其他计算机或进程的通信。这些方法包括连接、发送、接收等。不同的例子展示了不同的应用场景,可以根据实际需求选择适合的方式来使用socket通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Socket网络编程(python)](https://blog.csdn.net/shitou987/article/details/107966819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值