zoukankan      html  css  js  c++  java
  • python--select多路复用socket

    server:

    import select
    import socket
    import sys
    import queue
    import os
    
    
    #create a TCP/IP socket
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.setblocking(False)
    
    #Bind the socket to the port
    server_address = ('localhost',10000)
    server.bind(server_address)
    
    #Listen for incoming connections
    server.listen(1000)
    
    inputs = [server,]
    outputs = []
    while True:
        readable,writeable,exceptional = select.select(inputs,outputs,inputs)
        print(readable,writeable,exceptional)
        for r in readable:
            if r is server:  #代表来了一个新连接
                conn,addr = server.accept()
                print("来了一个新连接",conn,addr)
                inputs.append(conn) #是因为这个新建立的连接还没发数据过来,现在就接收的话程序就报错,
                              # 所以要想实现这个客户端发数据来时server端能知道就需要让select再检测这个conn
            else:
                data = r.recv(1024)
                print("收到的数据:",data.decode())
                r.send(data)
                print("send done....")
    

     client:

    import socket
    
    HOST = 'localhost'
    PORT = 10000
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    while True:
        msg = bytes(input(">>:").strip(), encoding="utf-8")
        if msg == 'q'.encode("utf-8"):
            exit("退出!")
        s.sendall(msg)
        data = s.recv(1024)
        print('Received',data.decode())
    s.close()
    

    select 加入队列的例子:  

    ####此例子中客户端断开异常未解决

    server:

    import select
    import socket
    import sys
    import queue
    import os
    
    
    #create a TCP/IP socket
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.setblocking(False)
    
    msg_dic = {}
    #Bind the socket to the port
    server_address = ('localhost',10000)
    server.bind(server_address)
    
    #Listen for incoming connections
    server.listen(1000)
    
    inputs = [server,]
    outputs = []
    while True:
        readable,writeable,exceptional = select.select(inputs,outputs,inputs)
        print(readable,writeable,exceptional)
        for r in readable:
            if r is server:  #代表来了一个新连接
                conn,addr = server.accept()
                print("来了一个新连接",conn,addr)
                inputs.append(conn) #是因为这个新建立的连接还没发数据过来,现在就接收的话程序就报错,
                               # 所以要想实现这个客户端发数据来时server端能知道就需要让select再检测这个conn
                msg_dic[conn] = queue.Queue() #初始化一个队列,后面存要返回给这个客户端的数据
            else:
                data = r.recv(1024)
                print("收到的数据:",data.decode())
                msg_dic[r].put(data)
    
                outputs.append(r)   #放入返回的连接队列里
                # r.send(data)
                # print("send done....")
    
        for w in writeable:  #要返回给客户端的连接列表
            data_to_client = msg_dic[w].get()
            w.send(data_to_client)  #返回给客户端的源数据
    
            outputs.remove(w)  #确保下次循环的时候writeable不返回这个已经处理完的连接
    
        for e in exceptional:
            if e in outputs:
                outputs.remove(e)
            inputs.remove(e)
            del msg_dic[e]
    

    client:

    import socket
    
    HOST = 'localhost'
    PORT = 10000
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    while True:
        msg = bytes(input(">>:").strip(), encoding="utf-8")
        if msg == 'q'.encode("utf-8"):
            exit("退出!")
        s.sendall(msg)
        data = s.recv(1024)
        print('Received',data.decode())
    s.close()
    
  • 相关阅读:
    设计模式(十六):职责链模式
    设计模式(十五):状态模式
    设计模式(十四):命令模式
    设计模式(十三):模板模式
    设计模式(十二):观察者模式
    远程连接数据库常出现的错误解析
    [解决] Error Code: 1044. Access denied for user 'root'@'%' to database
    linux常用命令
    linux上svn项目管理,同步服务器,用户管理
    linux 磁盘分区
  • 原文地址:https://www.cnblogs.com/guqing/p/6492800.html
Copyright © 2011-2022 走看看