from socket import *
import os,sys
import signal,time
host=”
port=8888
Addr=(host,port)

class Fs:
def init(self,c):
self.c=c
def cfile(self):
l=os.listdir(‘.’)
l1=[]
for i in l:
if os.path.isfile(i) and i[0]!=’.’:
l1.append(i)
else:
continue
file=’#’.join(l1)
if not l1:
self.c.send(‘空文件’.encode())
return
else:
self.c.send(‘ok’.encode())
time.sleep(1)

    self.c.send(file.encode())
def getfilename(self):
    l=os.listdir('.')
    l1=[]
    for i in l:
        if os.path.isfile(i) and i[0]!='.':
            l1.append(i)
        else:
            continue
    file='#'.join(l1)
    return file

def getfile(self):

    file=self.getfilename()
    self.c.send(file.encode())
    x=self.c.recv(1024)#收到文件名字序列号
    print(x.decode())
    y=file.split('#')[int(x.decode())]
    f=open(y,'rb')

    while True:
        data=f.read(1024)
        if not data:
            time.sleep(0.1)
            self.c.send('q'.encode())
            f.close()
            print('完成')
            break
        self.c.send(data)
def upfile(self):

    filename=self.c.recv(1024).decode()
    print(filename)
    f=open(filename,'wb')
    print('等待接收')
    while True:
        data=self.c.recv(1024)
        print('接收成功')
        print(data.decode())
        if data.decode()=='q':
            f.close()
            print('完成')
            break
        f.write(data)




#处理客户端请求

def client_handler(self):
    print('处理子进程的请求',self.c.getpeername())
    try:
        while True:
            data =self.c.recv(1024)
            print(data.decode())
            if not data.decode():
                sys.exit('客户退出')
                self.c.close()
            elif data.decode()=='c':
                print('收到命令')
                self.cfile()
            elif data.decode()=='d':
                print('收到命令')
                self.getfile()
            elif data.decode()=='u':
                print('收到命令')
                self.upfile()
            elif data.decode()=='q':
                break
            else:
                self.c.send('错误'.encode())
    except (KeyboardInterrupt,SyntaxError):
        sys.exit('客户退出')
    except Exception as e:
        print(e) 
    self.c.close()
    sys.exit()

创建套接字

def main():
s=socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(Addr)
s.listen(3)
print(‘等待连接%s’%os.getpid())
# 在父进程中忽略子进程状态 子进程退出自动由系统处理避免僵尸进程
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
while True:
try:
c,addr=s.accept()
except KeyboardInterrupt:
sys.exit(‘服务器退出’)
except Exception as e:
print(‘error’,e)
continue
else:
print(‘已经连接客户端’)
# 为客户端创建新的进程处理请求
pid=os.fork()
if pid==0:
s.close()
f=Fs(c)
f.client_handler()
# 无论是父进程还是失败都继续等待下个客户连接
else:
c.close()
continue
if name==”main“:
main()