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()
    
  • 相关阅读:
    Codeforces 1491 D. Zookeeper and The Infinite Zoo (二进制处理)
    Codeforces 1479A. Searching Local Minimum(注意输入+二分)
    Codeforces 1480B. The Great Hero(阅读模拟题,注意数据范围和攻击顺序)
    Codeforces 1480A. Yet Another String Game (阅读理解题)
    windows 10 开启全盘瞬间索引功能
    JetBrains CLion C++ IDE连接wsl2(Ubuntu)时,报错"Unable to establish SSL connection"解决方案
    WorkFlowy 的 MarkDown 预览方案解决
    git 学习 完全学懂
    jeecgboot <j-popup
    面试之类加载器
  • 原文地址:https://www.cnblogs.com/guqing/p/6492800.html
Copyright © 2011-2022 走看看