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()
    
  • 相关阅读:
    [转载] 使用DBProxy读写分离
    [转载] 数据库索引类型及实现方式
    [转载] 分布式数据库ID生成系统
    将博客搬至CSDN
    ERROR:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP
    JAVA:对数据库的一系列操作代码
    JAVA与 SQL server2008进行连接
    怎么样将数据库的表在Java中界面中显示出来
    c#与c++交互的一些东西
    WPF实现摄像头镜像翻转
  • 原文地址:https://www.cnblogs.com/guqing/p/6492800.html
Copyright © 2011-2022 走看看