我正在尝试实现TCP server
,它可以通过使用select module函数来处理客户机,但是我对来自的教程感到困惑
我想知道。我的代码是否正确?如果没有,我怎么能修好它
服务器端
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()
如果使用
select
,则不应设置非阻塞模式,因为每个请求都不会阻塞。在select中不使用output;你必须检查输出是否准备好,如果你想发送一些东西你不用协议
recv
最多可以接收1024个字节,但是您还必须处理这样的情况,即每个recv
只读取一个字节。所以你必须知道(通过协议)什么时候reqCommand
完成使用
select
时,不能使用while
-循环来接收更多数据。您必须读取主循环中的块并存储它们,直到传输完成使用
select
时,不能使用for
-循环和sendall
发送数据。您必须通过select
询问套接字是否准备好输出数据并使用send
及其返回值来知道已经发送了多少字节你不能处理封闭的连接
相关问题 更多 >
编程相关推荐