实现socket并发的几种方法

# 使用多进程实现socket聊天并发-server
#服务端
import socket
from multiprocessing import Process

def server(conn,addr):
    while True:
        try:
            msg=conn.recv(1024)
            conn.send(msg.upper())
        except Exception as f:
            print(f)
            conn.close()
            break
if __name__ == '__main__':
    sk=socket.socket()
    sk.bind(("127.0.0.1",8000))
    sk.listen(5)
    while True:
        conn,addr=sk.accept()
        p=Process(target=server,args=(conn,addr))
        p.start()
# 使用多进程实现socket聊天并发-server
import socket
from threading import Thread

def server(conn,addr):
    while True:
        try:
            msg=conn.recv(1024)
            conn.send(msg.upper())
        except Exception as f:
            print(f)
            conn.close()
            break
if __name__ == '__main__':
    sk=socket.socket()
    sk.bind(("127.0.0.1",8000))
    sk.listen(5)
    while True:
        conn,addr=sk.accept()
        t=Thread(target=server,args=(conn,addr))
        t.start()
# 使用协程实现socket聊天并发 - server
from gevent import monkey
monkey.patch_all()
import socket
import gevent
def talk(conn):
	while True:
		msg = conn.recv(1024).decode()
		ret_msg = msg.upper().encode()
		conn.send(ret_msg)

sk = socket.socket()
sk.bind(('127.0.0.1',8000))
sk.listen()

while True:
	conn,_ = sk.accept()
	g = gevent.spawn(talk,conn)
# 使用非阻塞IO实现socket聊天并发 - server
#服务端
from socket import *
import time
s=socket(AF_INET,SOCK_STREAM)
s.bind(('127.0.0.1',8080))
s.listen(5)
s.setblocking(False) #设置socket的接口为非阻塞
conn_l=[]
del_l=[]
while True:
    try:
        conn,addr=s.accept()
        conn_l.append(conn)
    except BlockingIOError:
        print(conn_l)
        for conn in conn_l:
            try:
                data=conn.recv(1024)
                if not data:
                    del_l.append(conn)
                    continue
                conn.send(data.upper())
            except BlockingIOError:
                pass
            except ConnectionResetError:
                del_l.append(conn)

        for conn in del_l:
            conn_l.remove(conn)
            conn.close()
        del_l=[]
# 使用IO多路复用实现socket聊天并发 - server
#服务端
from socket import *
import select

s=socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('127.0.0.1',8081))
s.listen(5)
s.setblocking(False) #设置socket的接口为非阻塞
read_l=[s,]
while True:
    r_l,w_l,x_l=select.select(read_l,[],[])
    print(r_l)
    for ready_obj in r_l:
        if ready_obj == s:
            conn,addr=ready_obj.accept() #此时的ready_obj等于s
            read_l.append(conn)
        else:
            try:
                data=ready_obj.recv(1024) #此时的ready_obj等于conn
                if not data:
                    ready_obj.close()
                    read_l.remove(ready_obj)
                    continue
                ready_obj.send(data.upper())
            except ConnectionResetError:
                ready_obj.close()
                read_l.remove(ready_obj)
# 使用socketserver实现socket聊天并发 - server
import socketserver
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "127.0.0.1", 9999

    # 设置allow_reuse_address允许服务器重用地址
    socketserver.TCPServer.allow_reuse_address = True
    # 创建一个server, 将服务地址绑定到127.0.0.1:9999
    server = socketserver.TCPServer((HOST, PORT),Myserver)
    # 让server永远运行下去,除非强制停止程序
    server.serve_forever()

  

原文地址:https://www.cnblogs.com/ellisonzhang/p/10473172.html