zoukankan      html  css  js  c++  java
  • Server socket

    用法都一样

    区别:  self.request  

      TCP  self.requsst 代表具体的链接

      UDP  self.requst 代表一个小元组(元组里面: 第一个元素 客户端发来的数据 ,第二个元素  回复客户端的套接字对象)

    基于UDP:

    import socketserver
    from threading import current_thread
    # fork linux下一个多进程接口 windows没有这接口
    # 用于处理请求的类
    
    class MyHandler(socketserver.BaseRequestHandler):
        def handle(self):
            print(self)
            print(self.server)  # 获取封装的服务器对象
            print(self.client_address)# 客户端地址
            print(self.request)# 是一个元祖 包含收到的数据 和服务器端的socket
            # data,client = self.request
    
            data = self.request[0]
            print(data.decode("utf-8"))
            self.request[1].sendto(b"i am server",self.client_address)
    
    server = socketserver.ThreadingUDPServer(("127.0.0.1",9999),MyHandler)
    server.serve_forever()
    
    
    
    # ThreadingUDPServer  在初始化的时候创建了socket对象
    # serve_forever() 将sockt注册到select(多路复用的)
    # select中返回一个ready  如果为True则可以处理 _handle_request_noblock   内部创建了一个MyHandler的示例  调用了handler函数
    
    #  使用了socket  OOP  多线程
    
    # 正常开发中 如果并发量不大 就是用socketserver
    # 否则用协程
    
    
    
    
    
    """
    使用时的区别:
    ThreadingTCPServer
        handler 在连接成功时执行
        self.request 是客户端的socket对象  
        
    ThreadingUDPServer
        handler 接收到数据时执行
        self.request  数据和服务器端的socket对象 
    
    
    """
    server
    #基于TCP 客户端
    import socket
    c  =  socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr = (('127.0.0.1',2020))
    # c.connect(addr)
    while True:
        msg = input('>>>: ')
        c.sendto(msg.encode('utf-8'),addr)
    
        print(c.recvfrom(1024)[0].decode('utf-8'))
    client

    基于TCP:

    import socketserver
    from threading import current_thread
    # fork linux下一个多进程接口 windows没有这接口
    
    # 用于处理请求的类
    class MyHandler(socketserver.BaseRequestHandler):
        def handle(self):
            print(self)
            print(self.server)  # 获取封装的服务器对象
            print(self.client_address)# 客户端地址
            print(self.request)# 获取客户端的socket对象
            print(current_thread())
            while True:
                data = self.request.recv(1024)
                print(data.decode("utf-8"))
                self.request.send(data.upper())
    
    
    server = socketserver.ThreadingTCPServer(("127.0.0.1",9999),MyHandler)
    server.serve_forever()
    server
    #基于TCP 客户端
    import socket
    c  =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    addr = (('127.0.0.1',2020))
    c.connect(addr)
    while True:
        msg = input('>>>: ')
        c.send(msg.encode('utf-8'))
    
        print(c.recv(1024).decode('utf-8'))
    client
  • 相关阅读:
    (一)关键字
    何时使用或何时不使用malloc函数?学数据结构有感
    typedef int a[10]; 怎么理解?
    Java的向上转型和向下转型
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException 异常解决方法
    java.lang.IllegalArgumentException: Property 'dataSource' is required 的解决
    哈希表
    python之创建虚拟环境
    idea2020.1.1踩坑:找不到程序包和符号
    Mysql使用过程中的问题及解决方案
  • 原文地址:https://www.cnblogs.com/TF511/p/9965741.html
Copyright © 2011-2022 走看看