zoukankan      html  css  js  c++  java
  • 服务器实现的多种方法汇总

    普通套接字方法(socket套接字

     1 from socket import socket
     2 server = socket() 4 server.bind(('', 9999))
     5 server.listen(10)
     6 
     7 conn, addr = server.accept()
     8 recv_date = conn.recv(1024)
     9 if recv_date:
    10     print(recv_date)
    11     conn.send(recv_date)
    12 else:
    13     conn.close()

     非阻塞套接字方法(非阻塞套接字

     1 from socket import socket
     2 server = socket()
     3 server.setblocking(False)
     4 server.bind(('', 9999))
     5 server.listen(100)
    6 all_client = [] 7 while True: 8 try: 9 conn, addr = server.accept() 10 conn.setblocking(False) 11 all_client.append(conn) 12 except BlockingIOError: 13 pass 14 15 for conn in all_client: 16 try: 17 recv_date = conn.recv(1024) 18 if recv_date: 19 print(recv_date) 20 conn.send(recv_date) 21 else: 22 conn.close() 23 all_client.remove(conn) 24 except BlockingIOError: 25 pass

     IO多路复用epoll方法(IO多路复用epollselector实现服务器

     1 import socket
     2 import selectors 
     3 epoll_selector = selectors.EpollSelector() 
     4 server = socket.socket()
     5 server.bind(('', 9980))
     6 server.listen(1000)
     7 
     8 def recv(conn):
     9     recv_date= conn.recv(1024)
    10     if recv_date:
    11         print(recv_date.decode())
    12         conn.send(recv_date)
    13     else:
    14         epoll_selector.unregister(conn)  
    15         conn.close()
    16 
    17 def accept(server1):
    18     conn, addr = server1.accept()
    19     epoll_selector.register(conn, selectors.EVENT_READ, recv)
    20 
    21 epoll_selector.register(server, selectors.EVENT_READ, accept)
    22 
    23 while True:
    24     events = epoll_selector.select()
    25     for key, mask in events:
    26         callable = key.data    
    27         sock = key.fileobj  
    28         callable(sock)

    多进程方法(详解

     1 import multiprocessing
     2 from socket import socket
     3 server = socket()
     4 server.bind(('', 9999))
     5 server.listen(100)
     6 
     7 def func(conn):
     8     while True:
     9         recv_date = conn.recv(1024)
    10         if recv_date:
    11             print(recv_date)
    12             conn.send(recv_date)
    13         else:
    14             conn.close()
    15 
    16 while True:
    17     conn, addr = server.accept()
    18     m = multiprocessing.Process(target=func, args=(conn, ))
    19     m.start()

     线程方法

     1 from socket import *
     2 import threading
     3 
     4 server = socket()
     5 server.bind(('', 9999))
     6 server.listen(100)
     7 
     8 def func(conn):
     9     while True:
    10         recv_date = conn.recv(1024)
    11         if recv_date:
    12             print(recv_date)
    13             conn.send(recv_date)
    14         else:
    15             conn.close()
    16 
    17 while True:
    18     conn, addr = server.accept()
    19     T = threading.Thread(target=func, args=(conn, ))
    20     T.start()

     进程池/线程池方法方法介绍

    from socket import socket
    from multiprocessing import Pool, cpu_count
    from multiprocessing.pool import ThreadPool
    
    def process_accept(server):         
        thread_pool = ThreadPool(n)    
        while True:
            conn, addr = server.accept()   
            thread_pool.apply_async(thread_recv, args=(conn, )) 
    
    def thread_recv(conn):          
        while True:
            recv_date = conn.recv(1024).decode()
            if recv_date:
                print(recv_date)
                conn.send(recv_date.encode())
            else:
                conn.close()
                break
    
    server = socket()
    server.bind(('', 8899))
    server.listen(200)
    
    n = cpu_count()     
    pool = Pool(n)      
    for i in range(n):
        pool.apply_async(process_accept, args=(server, ))  
    pool.close()
    pool.join()

     gevent协程实现

    from gevent import monkey; monkey.patch_socket()
    from socket import socket
    import gevent
    
    
    server = socket()   
    server.bind(('', 7788))
    server.listen(1000)
    
    def recv(conn):
        while True:
            recv_date = conn.recv(1024).decode()
            if recv_date:
                print(recv_date)
                conn.send(recv_date.encode())
            else:
                conn.close()
    
    while True:
        conn, addr = server.accept()
        gevent.spawn(recv, conn)
  • 相关阅读:
    IBatisNet不常用到的配置(Dao.config ConnectionTimeout),居然不起作用(前辈留给我们的坑)
    随机数 字母 数字
    证书文件(pfx)读取时报 “指定的网络密码不正确”
    SQL多结果集导出Excel
    Uva514
    PAT乙级1012
    栈-41
    位运算-89
    PAT乙级1028
    PAT乙级1029
  • 原文地址:https://www.cnblogs.com/pywjh/p/9480656.html
Copyright © 2011-2022 走看看