zoukankan      html  css  js  c++  java
  • day 29 socketserver 模块实现并发

    一 . socketserver

          之前我们写的tcp协议的socket是一次只能和一个客户通信,如果用socketserver的话就可以实现和多个客户端通信的,它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket。

    import socketserver #1、引入模块
    class MyServer(socketserver.BaseRequestHandler): #2、自己写一个类,类名自己随便定义,然后继承socketserver这个模块里面的                  BaseRequestHandler这个类

           def handle(self): #3、写一个handle方法,必须叫这个名字
           #self.request #6、self.request 相当于一个conn

           self.request.recv(1024) #7、收消息
           msg = '亲,学会了吗'
           self.request.send(bytes(msg,encoding='utf-8')) #8、发消息

           self.request.close() #9、关闭连接

           # 拿到了我们对每个客户端的管道,那么我们自己在这个方法里面的就写我们接收消息发送消息的逻辑就可以了
           pass
           if __name__ == '__mian__':
           #thread 线程,现在只需要简单理解线程,别着急,后面很快就会讲到啦,看下面的图
           server = socketserver.ThreadingTCPServer(('127.0.0.1',8090),MyServer)#4、使用socketserver的ThreadingTCPServer这个类,将IP和端口的元         祖传进去,还需要将上面咱们自己定义的类传进去,得到一个对象,相当于我们通过它进行了bind、listen
           server.serve_forever() #5、使用我们上面这个类的对象来执行serve_forever()方法,他的作用就是说,我的服务一直开启着,就像京东一样,不能关闭网站,对吧,并且serve_forever()帮我们进行了accept


    #注意:
    #有socketserver 那么有socketclient的吗?
    #当然不会有,我要作为客户去访问京东的时候,京东帮我也客户端了吗,客户端是不是在我们自己的电脑啊,并且socketserver对客户端没有太高的要求,只需要自己写一些socket就行了。

    二 . ThreadingTCPServer多线程

           分析socket源代码,面向对象的继承的实战

    三 . 完整的socketserver服务端和客户端代码的实列

          服务端:

    import socketserver
    class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
    self.data = self.request.recv(1024).strip()
    print("{} wrote:".format(self.client_address[0]))
    print(self.data)
    self.request.sendall(self.data.upper())

    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 = socketserver.ThreadingTCPServer((HOST, PORT),Myserver)
    # 让server永远运行下去,除非强制停止程序
    server.serve_forever()

    tcp_server.py

         客户端:

    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(bytes(data + " ", "utf-8")) # 向服务端发送数据
    received = str(sock.recv(1024), "utf-8")# 从服务端接收数据

    print("Sent: {}".format(data))
    print("Received: {}".format(received))

    tcp_client.py

  • 相关阅读:
    php 计算两点地理坐标的距离
    objective-c中#import和@class的差别
    我与小娜(07):量子通信的奥
    OpenStack部署到Hadoop的四种方案
    iOS UI13_数据解析XML_,JSON
    Redis集群
    《AndroidStudio有用指南》反馈问题和建议
    numpy函数库中一些经常使用函数的记录
    1015 history grep |mysql
    php 生成压缩文件
  • 原文地址:https://www.cnblogs.com/liuteacher/p/10020384.html
Copyright © 2011-2022 走看看