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()
posted @ 2020-05-21 11:31  小鬼鬼QVQ  阅读(173)  评论(0)    收藏  举报