如何在TCP中实现select()模块函数

2024-10-01 00:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现TCP server,它可以通过使用select module函数来处理客户机,但是我对来自的教程感到困惑

  1. How does the select() function in the select module of Python exactly work?
  2. https://pymotw.com/2/select

我想知道。我的代码是否正确?如果没有,我怎么能修好它

服务器端

import socket,sys,os,select,Queue
HOST = 'localhost'                 
PORT = 3820

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setblocking(0)
server.bind((HOST, PORT))

server.listen(5)
inputs = [ server ]

while (1):
    inputready,outputready,exceptready = select.select(inputs,[],[])
    for s in inputready:
        if s is server:
            conn, addr = server.accept()
            print 'Client connected ..'
            conn.setblocking(0)
            inputs.append(conn)
        else:
            reqCommand = conn.recv(2048)
            if reqCommand:
            print 'Client> %s' %(reqCommand)

    if (reqCommand == 'quit'):
        print 'Client disconected'
        break

    #list file on server
    elif (reqCommand == 'lls'):
        start_path = os.listdir('.') # server directory
        for path,dirs,files in os.walk(start_path):
            for filename in files:
                print os.path.join(filename)

    else:
        string = reqCommand.split(' ', 1)   #in case of 'put' and 'get' method
        reqFile = string[1] 

        if (string[0] == 'put'):
            with open(reqFile, 'wb') as file_to_write:
                while True:
                    data = conn.recv(2048)
                    # print data
                    if not data:
                        break
                    # print data
                    file_to_write.write(data)
                    file_to_write.close()
                    break
            print 'Receive Successful'

        elif (string[0] == 'get'):
            with open(reqFile, 'rb') as file_to_send:
                for data in file_to_send:
                    conn.sendall(data)
            print 'Send Successful'

conn.close()

server.close()

Tags: topathinfordatastringifserver
1条回答
网友
1楼 · 发布于 2024-10-01 00:29:57

如果使用select,则不应设置非阻塞模式,因为每个请求都不会阻塞。在select中不使用output;你必须检查输出是否准备好,如果你想发送一些东西

你不用协议recv最多可以接收1024个字节,但是您还必须处理这样的情况,即每个recv只读取一个字节。所以你必须知道(通过协议)什么时候reqCommand完成

使用select时,不能使用while-循环来接收更多数据。您必须读取主循环中的块并存储它们,直到传输完成

使用select时,不能使用for-循环和sendall发送数据。您必须通过select询问套接字是否准备好输出数据并使用send及其返回值来知道已经发送了多少字节

你不能处理封闭的连接

相关问题 更多 >