博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务器实现的多种方法汇总
阅读量:4563 次
发布时间:2019-06-08

本文共 3826 字,大约阅读时间需要 12 分钟。

普通套接字方法()

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         pass14 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方法()

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 socketfrom multiprocessing import Pool, cpu_countfrom multiprocessing.pool import ThreadPooldef 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()            breakserver = 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 socketimport geventserver = 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)

 

转载于:https://www.cnblogs.com/pywjh/p/9480656.html

你可能感兴趣的文章
大数据等最核心的关键技术:32个算法
查看>>
Maven多模块项目搭建
查看>>
redis列表list
查看>>
雷林鹏分享: C# 简介
查看>>
ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法
查看>>
实用类-<Math类常用>
查看>>
构建之法阅读笔记之四
查看>>
10.15习题2
查看>>
Windows Server 2008 R2 备份与恢复详细实例
查看>>
Ubuntu上kubeadm安装Kubernetes集群
查看>>
关于java学习中的一些易错点(基础篇)
查看>>
MFC的多国语言界面的实现
查看>>
四则运算个人项目 最终版
查看>>
java线程系列---java5中的线程池
查看>>
SQL表连接
查看>>
新秀系列C/C++经典问题(四)
查看>>
memset函数具体说明
查看>>
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
深入浅出HTTPS基本原理
查看>>