八. 网络编程( socketserver 模块 初级使用)

一 .socketserver 模块初级使用

ThreadingTCPServer
ocketserver是标准库中的一个高级模块
socketserver可以简化创建客户端跟创建服务端的代码
socketserver     可以用于 TCP 协议
应用场景
       应为tcp是一个长连接 只能保持一个人通话  但是socketserver就解决了同时多个客户端来 通话

初始化控制器类Handler【Handler是一个继承BaseRequestHandler的类Handler中的handle方法决定了每一个连接过来的操作】 【控制器类的类名可以是其他的,不一定是Handler,只要继承了BaseRequestHandler就行】
init():初始化控制设置,初始化连接套接字,地址,处理实例等信息
handle(): 定义了如何处理每一个连接。
setup(): 在handle()之前执行.一般用作设置默认之外的连接配置
finish():在handle()之后执行。
server1
import  socketserver
class Myserver(socketserver.BaseRequestHandler):

   def handle(self):
       # print(self.request)    self.request相当 socket 服务器端的conn
        self.ret=self.request.recv(1024)
        print(self.ret.decode("utf-8"))
        user=input("我是服务器:")
        self.request.send(user.encode("utf-8"))

if __name__=="__main__":
   server=socketserver.ThreadingTCPServer(("192.168.59.1",8600),Myserver)
   # 线程
   server.serve_forever()

# bind  listen
# conn,addr=accept
# self.request=conn
client1
import  socket

clinet=socket.socket()
clinet.connect(("192.168.59.1",8600))
name=input("我是客户端:")
clinet.send(name.encode("utf-8"))

ret=clinet.recv(1024).decode("utf-8")
print(ret)

 # def handle(self): 注意这个self 包含了两个参数 第一个参数信息(self.request==conn) 第二个参数是地址(self.client_address=addr)

server2
import socketserver
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        self.request.sendall(self.data.upper())

        print(self.data.decode("utf-8"))
        print(self.client_address[0])   #  self.client_address 地址里面包含ip 端口 是以元祖的形式

if __name__ == "__main__":
    HOST, PORT = "127.0.0.1", 9999

    # 设置allow_reuse_address允许服务器重用地址
    socketserver.TCPServer.allow_reuse_address = True
    # 创建一个server, 将服务地址绑定到127.0.0.1:9999
    server = socketserver.TCPServer((HOST, PORT),Myserver)
    # 让server永远运行下去,除非强制停止程序
    server.serve_forever()
client2
import socket

HOST, PORT = "127.0.0.1", 9999
data = "hello"

# 创建一个socket链接,SOCK_STREAM代表使用TCP协议
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:

    sock.connect((HOST, PORT))          # 链接到客户端
    sock.sendall(data.encode("utf-8")) # 向服务端发送数据
    received = sock.recv(1024).decode("utf-8")# 从服务端接收数据

print(data)
print(received)

二 .剖析soketserver(源码)

https://www.cnblogs.com/Eva-J/p/5081851.html

 1.soketserver(类似里面继承关系)

#_*_coding:utf-8_*_
__author__ = ‘Eva_J‘
class Base(object):
    def Testfunc(self):
        print(‘do Base Testfunc‘)

class Son(Base):
    def __init__(self,name):
        self.name = name
        self.Testfunc()

    def Testfunc(self):
        print( ‘do Son Testfunc‘)

class Base2(object):
    def Testfunc(self):
        print (‘do Base2 Testfunc‘)

class GrandSon(Base2,Son):
    pass

#sonobj = Son(‘sonobj‘)
sonobj = GrandSon(‘哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇‘)
print(sonobj.name)

sonobj.Testfunc()
  看上面的代码,我们猜测一下,执行之后,控制台会打印什么呢?先揭晓答案,会打印Base2方法中的内容,原因很简单:
尽管这三个类中都有同样的Testfunc方法,但是,由于计算机在找方法的时候,
遵循的顺序是:Base2,Son,Base,所以它会先找到Base2类,而这个类中刚好有它要找的方法,它也就欢欢喜喜的拿去执行啦!
print(GrandSon.__mro__)
print(GrandSon.__bases__)
print(GrandSon.__name__)
print(GrandSon.__dict__)
print(sonobj.__dict__)

print("*****************************************************************************************************8")
#_*_coding:utf-8_*_
__author__ = ‘Eva_J‘
class Base(object):
    def __init__(self,name):
        self.name = name
        self.Testfunc()

    def Testfunc(self):
        print (‘do Base Testfunc‘)

class Son(Base):
    def Testfunc(self):
        print (‘do Son Testfunc‘)

sonobj = Son(‘sonobj‘)
# 果这样看,我们是不是就明白了?其实这两段代码表示的是一个意思,尽管Son继承了Base类,父子类中都有同样的方法,
# 但是由于我们实例化了子类的对象,所以这个在初始化方法里的self.Testfunc,self指的是子类的对象,当然也就先调用子类中的方法啦
# 。所以尽管在第一个例子中,初始化方法在父类执行,但是还是改变不了它是子类对象的本质,
# 当我们使用self去调用Testfunc方法时,始终是先调用子类的方法。我们可以这样理解,
# 尽管儿子继承了父亲的财产,但是花钱的时候,还是要先花自己的~~~
#  注意这个self 包含了两个参数 第一个参数信息(self.request==conn)    第二个参数是地址(self.client_address=addr)

原文地址:https://www.cnblogs.com/Sup-to/p/11144857.html

时间: 2024-10-08 10:16:31

八. 网络编程( socketserver 模块 初级使用)的相关文章

Python2与Python3的区别/网络编程/socketserver模块中的多线程

一.知识点补充: 1.解释型语言和编译型语言 编译型(目前有两种解释): 先把代码编译成机器码 -> 机器寄存器去运行 :C语言 先把代码编译成XXX -> 计算机找虚拟机执行代码 -> 机器码交给计算机去执行 :C语言,JAVA,C# 解释型: 边解释边执行 2.Python中的作用域 Python中的函数是一个作用域 3.这里规定一下以后写元组的格式: v = (1,2,3,) 1.Python中函数是一个作用域 i=0 for i in range(10): pass print(

py2/py3区别, 列表生成式, 网络编程, socketserver, 线程, uuid模块

一. py2/py3区别    - 编码&字符串        字符串:            py2:                unicode         v = u"root"    本质上用unicode存储(万国码)                (str/bytes)     v = "root"     本质用字节存储            py3:                str                v = "

网络编程与模块相关

BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层模型 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 每层运行常见物理设备 详细参考: http://www.cnblogs.com/linhaifeng/articles/5937962.html#_label4 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标就是教会你如何

38 - 网络编程-socketserver

目录 1 socket编程弊端 2 SocketServer模块 2.1 服务器类 2.2 Mixin类 2.3 RequestHandlerClass是啥 2.4 编程接口 3 实现EchoServer 4 聊天室 1 socket编程弊端 socket编程过于底层,编程虽然有套路,但是要写出健壮的代码还是比较困难的,所以很多语言都会socket底层API进行封装,Python的封装就是SocketServer模块.它是网络服务编程框架,便于企业级快速开发. 2 SocketServer模块

【python】网络编程-SocketServer 实现客户端与服务器间非阻塞通信

利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信.首先,先了解下SocketServer模块中可供使用的类:BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩:这个类只用于派生,所以不会生成这个类的实例:可以考虑使用TCPServer和UDPServer.TCPServer/UDPServer:基本的网络同步TCP/UDP服务器.UnixStreamServer/ UnixDatagramServer:基本的基于文件同步TCP/UDP服务器.Fork

TCP/IP网络编程系列之四(初级)

TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的套接字.在了解TCP之前,先了解一下TCP所属的TCP/IP协议栈. 如图所示,TCP/IP协议栈共分为4层,可以理解成数据收发分成了4个层次化过程. 链路层 它是物理链接领域标准化结果,也是最基本的领域,专门定义LAN.WAN.MAN等网络标准.若两台计算机通过网络进行数据交换,链路层就负责整个物

python网络编程-----> socketserver实现并发

1.socketserver的作用: 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环 socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题) 2.代码实现: 服务端: import socketserver class MyTcphandler(socketserver.BaseRequestHandler): def handle(self): while True: #通信循环 data=self.request.recv(

网络---29 socketserver模块并发 连接合法性

一.socketserver模块 ②服务端 ③客户端 二.连接合法性       ①os.urandom(n) 一种bytes类型的随机生成n个字节字符串的方法 而且每次生成的值都不相同.再加上md5等加密的处理 就能够成内容不同长度相同的字符串了. ②hmac ③ 可见使用hmac和普通hash算法非常类似. hmac输出的长度和原始哈希算法的长度一致. 需要注意传入的key和message都是bytes类型, str类型需要首先编码为bytes. 原文地址:https://www.cnblo

网络编程- strcuct模块定制报头的理论(八)

合一起发也是一样效果,也会遵守协议,先接收四个字节 原文地址:https://www.cnblogs.com/mys6/p/10799595.html