1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import socket,os,json,sys,pickle 5 import selectors 6 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(
__file__
)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 10 from cfg import config 11 12 13 #用户名检测函数 14 15 def open_file_list(name,pas):#传入当前类 16 with open(config.USER_FILE,
'r'
,encoding=
'utf-8'
)
as
f: 17 data=
eval
(f.readline()) 18
print
(data) 19
if
name in data
and
pas==data[name]: 20
return
True 21
else
: 22
return
False 23 24 25 26 27 #连接类 28
class
socket_server(object): 29
''
'连接类'
''
30 file_path=config.USER_DIR#用户路经变量 31 def __init__(self,data,conn):#传入 32 33 self.DATA=data 34 self.conn=conn 35 36 37 def ret_l(self): 38 self.ret=self.login(self.DATA[
"name"
],self.DATA[
'pwd'
],self.conn)#用户名检测 39
return
self.ret 40 def open_f(self):#打开目录 41 42 file_dir=os.path.join(config.USER_DIR)#用户目录 43
print
(file_dir) 44 file_name=os.listdir(file_dir)#目录文件列表 45 f=file_dir+
'/'
+self.DATA[
'filename'
]##上传的文件名 46
return
file_dir,file_name,f#返回 47 48 def ls_file(self,data):#查看文件 49 self.conn.send(json.dumps(data[1]).encode()) 50 51 def send_file(self,data): 52 53
if
self.DATA[
'filename'
] in data[1]:#如果是输入文件名 54 f=data[0]+
'/'
+self.DATA[
'filename'
] 55 file_obj=open(f,
"rb"
)#打开文件 56 name=file_obj.name.split(
'/'
)[-1]#文件名 57 sez=os.path.getsize(f)#获取文件大小 58
if
sez<1: 59
print
(
'文件错误!'
) 60 data={
'filename'
:False} 61 self.conn.send(json.dumps(data).encode()) 62
print
(
''
.center(30,
'='
)) 63
print
(sez) 64
print
(
''
.center(30,
'='
)) 65 data_header={ 66
"action"
:
"put"
, 67
"filename"
:name, 68
"size"
:sez 69 } 70 self.conn.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息 71
for
line in file_obj: 72 self.conn.send(line)#发送数据 73 74 elif self.DATA[
'filename'
].isdigit():#如果是输入编号 75 num=int(self.DATA[
'filename'
])#转为数字 76
try
: 77 f=data[0]+
'/'
+data[1][num]# 78 file_obj=open(f,
"rb"
)#打开文件 79 name=file_obj.name.split(
'/'
)[-1]#文件名 80 sez=os.path.getsize(f)#获取文件大小 81
if
sez<1: 82
print
(
'文件错误!'
) 83 data={
'filename'
:False} 84 self.conn.send(json.dumps(data).encode()) 85
print
(sez) 86 data_header={ 87
"action"
:
"put"
, 88
"filename"
:name, 89
"size"
:sez 90 } 91 self.conn.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息 92
for
line in file_obj: 93 self.conn.send(line)#发送数据 94 self.conn.send(json.dumps(f).encode())#发送文件 95 except Exception
as
e: 96 data={
'filename'
:False} 97 self.conn.send(json.dumps(data).encode()) 98
else
: 99 data={
'filename'
:False}100 self.conn.send(json.dumps(data).encode())101 def put_file(self,data):#上传文件102 file_obj=open(data[2],
'wb'
)#打开新建 这个文件103 rece_size=0#定义 文件大小值104
while
rece_size<self.DATA[
"size"
]:#小于接收的文件大小时,105 recv_data=self.conn.recv(4096)106 file_obj.write(recv_data)#写入文件107 rece_size+=len(recv_data)#增加文件大小计算108
else
:109
print
(
"文件[%s]接收完毕!"
%self.DATA[
"filename"
])110 file_obj.
flush
()111 file_obj.close()#关闭文件112 #@staticmethod113 def login(self,name,pas,conn):#用户检测 函数114
try
:115
if
open_file_list(name,pas):116 tag=True117 error=
''
118 datas={
'user'
:name}119 data={
'mag'
:
'用户认证通过'
,
'tag'
:True}120
print
(json.dumps(data).encode())121 conn.send(json.dumps(data).encode())122
else
:123 raise Exception(
'\033[41;1m用户名或密码错误\033[0m'
%name)124 except Exception
as
e:125 tag=False126 error=str(e)127 datas=
''
128 data={
'mag'
:
'用户或密码错误'
,
'tag'
:False}129
print
(
'发送数据%s'
%data)130 conn.send(json.dumps(data).encode())131
return
{
'tag'
:tag,
'error'
:error,
'data'
:datas}