python小项目电子词典之服务端
#涉及知识点tcp,套接字,多进程,mysql,
#注意:mysql部分需要对应自身的库做出修改
from socket import *
import os
import sys
from time import sleep
import signal
# 文件库路径
FILE_PATH = '/home/u/mysql/'
HOST = '0.0.0.0'
PORT = 8888
ADDR = (HOST, PORT)
# 将文件服务器功能写在类内
class FtpServer(object):
def __init__(self, s, c):
self.s = s
self.c = c
def dolist(self):
# 获取文件列表
file_list = os.listdir(FILE_PATH)
if not file_list:
self.c.send('文件库为空'.encode())
return
else:
self.c.send(b'OK')
sleep(0.1)
files = ''
for file in file_list:
if file[0] != '.' and os.path.isfile(FILE_PATH + file):
files = files + file + '#'
# sendall 发送所有
self.c.sendall(files.encode())
def copy(self, filename):
print('Copy被调用')
try:
fd = open(FILE_PATH + filename, 'rb')
except:
self.c.send('文件不存在'.encode())
return
self.c.send(b'OK')
sleep(0.1)
while True:
data = fd.read(1024)
if not data:
self.c.send(b'##')
break
self.c.send(data)
print('文件发送完毕')
fd.close()
def hal(self):
pass
def main():
s = socket()
# 设置端口重用
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
s.listen()
# 处理子进程退出
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
print('listen the port 8888')
while True:
try:
print('waiting for connect....')
c, addr = s.accept()
print('connect from {}'.format(addr))
except:
sys.exit('服务器退出')
print('已链接客户端')
pid = os.fork()
if pid == 0:
ftp = FtpServer(s, c)
# 判断客户端请求
while True:
data = c.recv(1024).decode()
if not data:
c.close()
sys.exit('客户端退出')
elif data[0] == 'L':
ftp.dolist()
elif data[0] == 'C':
filename = data[1:]
print(filename)
ftp.copy(filename)
elif data[0] == 'H':
ftp.hal()
else:
c.close()
if __name__ == '__main__':
main()

浙公网安备 33010602011771号