懂ni 发表于 2018-8-4 09:12:55

python的服务

#服务端  
import socket
  
import os
  
import json
  
import struct
  
SHARE_DIR=r'F:\SHARE'          #目标文件路径
  
class FtpServer:
  
    def __init__(self,host,port):
  
      self.host=host
  
      self.port=port
  
      self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  
      self.server.bind((self.host,self.port))
  
      self.server.listen(5)
  
    def serve_forever(self):
  
      print('server starting...')
  
      while True:
  
            self.conn,self.client_addr=self.server.accept()
  
            print(self.client_addr)
  
            while True:
  
                try:
  
                  data=self.conn.recv(1024)#params_json.encode('utf-8')
  
                  if not data:break
  
                  params=json.loads(data.decode('utf-8')) #params=['get','a.txt']
  
                  cmd=params
  
                  if hasattr(self,cmd):
  
                        func=getattr(self,cmd)
  
                        func(params)
  
                  else:
  
                        print('\033[45mcmd not exists\033[0m')
  
                except ConnectionResetError:
  
                  break
  
            self.conn.close()
  
      self.server.close()
  
    def get(self,params): #params=['get','a.txt']
  
      filename=params #filename='a.txt'
  
      filepath=os.path.join(SHARE_DIR,filename)
  
      if os.path.exists(filepath):
  
            headers = {                                           #制作报头
  
                'filename': filename,
  
                'md5': '123sxd123x123',
  
                'filesize': os.path.getsize(filepath)
  
            }
  
            headers_json = json.dumps(headers)
  
            headers_bytes = headers_json.encode('utf-8')
  
            self.conn.send(struct.pack('i',len(headers_bytes)))#先发报头的长度
  
            self.conn.send(headers_bytes)                        #发送报头
  
            with open(filepath,'rb') as f:                     #发送真实的数据
  
                for line in f:
  
                  self.conn.send(line)
  
    def put(self):
  
      pass
  
if __name__ == '__main__':
  
    server=FtpServer('127.0.0.1',8081)
  
    server.serve_forever()
  
##客户端
  
import socket
  
import struct
  
import json
  
import os
  
DOWNLOAD_DIR=r'F:\DOWNLOAD'    #下载路径
  
class FtpClient:
  
    def __init__(self,host,port):
  
      self.host=host
  
      self.port=port
  
      self.client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  
      self.client.connect((self.host,self.port))
  
    def interactive(self):
  
      while True:
  
            data=input('>>: ').strip() #get a.txt
  
            if not data:continue
  
            params=data.split() #parmas=['get','a.txt']
  
            cmd=params #cmd='get'
  
            if hasattr(self,cmd):
  
                func=getattr(self,cmd)
  
                func(params) #func(['get','a.txt'])
  
    def get(self,params):
  
      params_json=json.dumps(params)
  
      self.client.send(params_json.encode('utf-8'))
  
      headers_size = struct.unpack('i', self.client.recv(4))   #接收报头长度
  
      headers_bytes = self.client.recv(headers_size)         #接收报头
  
      headers_json = headers_bytes.decode('utf-8')
  
      headers_dic = json.loads(headers_json)
  
      # print('========>', headers_dic)
  
      filename = headers_dic['filename']
  
      filesize = headers_dic['filesize']
  
      filepath = os.path.join(DOWNLOAD_DIR, filename)
  
      with open(filepath, 'wb') as f:                   #接收真实数据
  
            recv_size = 0
  
            while recv_size < filesize:
  
                line = self.client.recv(1024)
  
                recv_size += len(line)
  
                f.write(line)
  
            print('===>下载成功')
  
if __name__ == '__main__':
  
    client=FtpClient('127.0.0.1',8081)
  
    client.interactive()
页: [1]
查看完整版本: python的服务