zoukankan      html  css  js  c++  java
  • socketservice模块

    socketservice模块

    socketservice模块可以实现多客户端同时连接服务端

    1 基于TCP协议的模块使用

    客户端

    from socket import *
    
    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('127.0.0.1',8889))
    
    while True:
        msg=input('请输入命令>>:').strip()
        if len(msg) == 0:continue
        client.send(msg.encode('utf-8'))
    
        res=client.recv(1024)
        print(res.decode('utf-8'))
    

    服务端

    import socketserver
    
    class MyRequestHandle(socketserver.BaseRequestHandler):
        def handle(self):
            # 如果tcp协议,self.request=>相当于socket里的conn
            print(self.client_address)
            while True:
                try:
                    msg = self.request.recv(1024)
                    if len(msg) == 0: break
                    self.request.send(msg.upper())
                except Exception:
                    break
            self.request.close()
    
    
    
    #  服务端应该做两件事
    # 第一件事:循环地从半连接池中取出链接请求与其建立双向链接,拿到链接对象
    s=socketserver.ThreadingTCPServer(('127.0.0.1',8889),MyRequestHandle)
    s.serve_forever()
    # 等同于
    # while True:
    #     conn,client_addr=server.accept()
    #     启动一个线程(conn,client_addr)
    
    # 第二件事:拿到链接对象,与其进行通信循环===>handle
    

    2 基于UDP协议的模块使用

    客户端

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
    
    while True:
        msg = input('>>>: ').strip()
        client.sendto(msg.encode('utf-8'), ("127.0.0.1", 8888))
        res = client.recvfrom(1024)
        print(res)
    
    client.close()
    

    服务端

    import socketserver
    
    class MyRequestHanlde(socketserver.BaseRequestHandler):
        def handle(self):
            # self.request为一个元组,第一个元素时接受到的数据,第二个元素是socket对象
            # 第二个元素:service
            # service = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
            client_data=self.request[0]
            server=self.request[1]
            client_address=self.client_address
            print('客户端发来的数据%s' %client_data)
            server.sendto(client_data.upper(),client_address)
    
    
    s=socketserver.ThreadingUDPServer(("127.0.0.1",8888),MyRequestHanlde)
    s.serve_forever()
    # 相当于:只负责循环地收
    # while True:
    #     data,client_addr=server.recvfrom(1024)
    #     启动一个线程处理后续的事情(data,client_addr)
    

    3 总结

    基于tcp的socketserver我们自己定义的类中的

    1. self.server即套接字对象
    2. self.request即一个链接
    3. self.client_address即客户端地址

    基于udp的socketserver我们自己定义的类中的

    1. self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', )
    2. self.client_address即客户端地址
  • 相关阅读:
    CodeForces 288A Polo the Penguin and Strings (水题)
    CodeForces 289B Polo the Penguin and Matrix (数学,中位数)
    CodeForces 289A Polo the Penguin and Segments (水题)
    CodeForces 540C Ice Cave (BFS)
    网站后台模板
    雅图CAD
    mbps
    WCF学习-协议绑定
    数据库建表经验总结
    资源位置
  • 原文地址:https://www.cnblogs.com/achai222/p/12745797.html
Copyright © 2011-2022 走看看