• 实现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()
    

      

  • 相关阅读:
    【译】第26节---配置一对多关系
    【译】第25节---配置一对一关系
    【译】第24节---Fluent API
    pycharm 更改创建文件默认路径和修改字体大小
    软件工程----自我介绍
    课堂作业---读取文件实现求数组中所有子数组和的最大值
    实现数组中连续子数组值和最大
    android-----实现不两个不同的activity的跳转和数据传递
    android------解决editText只输入一行和textView不显示过多的内容
    android-------实现底部导航的模板
  • 原文地址:https://www.cnblogs.com/ellisonzhang/p/10473172.html
Copyright © 2020-2023  润新知