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()
    
  • 相关阅读:
    利用HttpModule做流量记录
    VS2010 调试出现 asp.net development server 错误
    利用win7自带的虚拟WIFI网卡,与其他设备共享网络
    关于 ASP 中使用 Server.CreateObject("ADODB.Stream") 上传文件报错
    lightweight jobs
    YOLO v3 包括Tiny-Yolo 训练自己的数据集(Pytorch版本)以及模型评价指标的介绍
    Sublime Text3 下载安装与激活使用
    QT中自定义封装控件笔记
    19_7_25-7_27 暑假学校收获
    数字图像处理基础知识2
  • 原文地址:https://www.cnblogs.com/guqing/p/6492800.html
Copyright © 2011-2022 走看看