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即客户端地址
  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/achai222/p/12745797.html
Copyright © 2011-2022 走看看