国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現的文件同步服務器實例

2020-02-23 01:27:57
字體:
來源:轉載
供稿:網友

本文實例講述了python實現的文件同步服務器。分享給大家供大家參考。具體實現方法如下:

服務端使用asyncore, 收到文件后保存到本地。

客戶端使用pyinotify監視目錄的變化 ,把變動的文件發送到服務端。

重點:

1. 使用structs打包發送文件的信息,服務端收到后,根據文件信息來接收客戶端傳送過來的文件。

2. 客戶端使用多線程,pyinotify監視到文件變化,放到隊列中,由另外一個線程發送。

上代碼:

服務端:

# receive file from client and store them into file use asyncore.# #/usr/bin/python #coding: utf-8 import asyncore import socket from socket import errno import logging import time import sys import struct import os import fcntl import threading from rrd_graph import MakeGraph try:   import rrdtool except (ImportError, ImportWarnning):   print "Hope this information can help you:"   print "Can not find pyinotify module in sys path, just run [apt-get install python-rrdtool] in ubuntu."   sys.exit(1) class RequestHandler(asyncore.dispatcher):   def __init__(self, sock, map=None, chunk_size=1024):     self.logger = logging.getLogger('%s-%s' % (self.__class__.__name__, str(sock.getsockname())))     self.chunk_size = chunk_size     asyncore.dispatcher.__init__(self,sock,map)     self.data_to_write = list()   def readable(self):     #self.logger.debug("readable() called.")     return True   def writable(self):     response = (not self.connected) or len(self.data_to_write)     #self.logger.debug('writable() -> %s data length -> %s' % (response, len(self.data_to_write)))     return response   def handle_write(self):     data = self.data_to_write.pop()     #self.logger.debug("handle_write()->%s size: %s",data.rstrip('/r/n'),len(data))     sent = self.send(data[:self.chunk_size])     if sent < len(data):       remaining = data[sent:]       self.data_to_write.append(remaining)   def handle_read(self):     self.writen_size = 0     nagios_perfdata = '../perfdata'     head_packet_format = "!LL128s128sL"     head_packet_size = struct.calcsize(head_packet_format)     data = self.recv(head_packet_size)     if not data:       return     filepath_len, filename_len, filepath,filename, filesize = struct.unpack(head_packet_format,data)     filepath = os.path.join(nagios_perfdata, filepath[:filepath_len])     filename = filename[:filename_len]     self.logger.debug("update file: %s" % filepath + '/' + filename)    try:       if not os.path.exists(filepath):         os.makedirs(filepath)     except OSError:       pass     self.fd = open(os.path.join(filepath,filename), 'w')     #self.fd = open(filename,'w')     if filesize > self.chunk_size:       times = filesize / self.chunk_size       first_part_size = times * self.chunk_size       second_part_size = filesize % self.chunk_size       while 1:         try:           data = self.recv(self.chunk_size)           #self.logger.debug("handle_read()->%s size.",len(data))         except socket.error,e:           if e.args[0] == errno.EWOULDBLOCK:             print "EWOULDBLOCK"             time.sleep(1)           else:             #self.logger.debug("Error happend while receive data: %s" % e)             break         else:           self.fd.write(data)           self.fd.flush()           self.writen_size += len(data)           if self.writen_size == first_part_size:             break       #receive the packet at last       while 1:         try:           data = self.recv(second_part_size)           #self.logger.debug("handle_read()->%s size.",len(data))         except socket.error,e:           if e.args[0] == errno.EWOULDBLOCK:             print "EWOULDBLOCK"             time.sleep(1)           else:             #self.logger.debug("Error happend while receive data: %s" % e)             break         else:           self.fd.write(data)           self.fd.flush()           self.writen_size += len(data)           if len(data) == second_part_size:             break     elif filesize <= self.chunk_size:       while 1:         try:           data = self.recv(filesize)           #self.logger.debug("handle_read()->%s size.",len(data))         except socket.error,e:           if e.args[0] == errno.EWOULDBLOCK:             print "EWOULDBLOCK"             time.sleep(1)           else:             #self.logger.debug("Error happend while receive data: %s" % e)             break         else:           self.fd.write(data)           self.fd.flush()           self.writen_size += len(data)           if len(data) == filesize:             break     self.logger.debug("File size: %s" % self.writen_size) class SyncServer(asyncore.dispatcher):   def __init__(self,host,port):     asyncore.dispatcher.__init__(self)     self.debug = True     self.logger = logging.getLogger(self.__class__.__name__)     self.create_socket(socket.AF_INET,socket.SOCK_STREAM)     self.set_reuse_addr()     self.bind((host,port))     self.listen(2000)   def handle_accept(self):     client_socket = self.accept()     if client_socket is None:       pass     else:       sock, addr = client_socket       #self.logger.debug("Incoming connection from %s" % repr(addr))       handler = RequestHandler(sock=sock) class RunServer(threading.Thread):   def __init__(self):     super(RunServer,self).__init__()     self.daemon = False   def run(self):     server = SyncServer('',9999)     asyncore.loop(use_poll=True) def StartServer():   logging.basicConfig(level=logging.DEBUG,             format='%(name)s: %(message)s',             )   RunServer().start()   #MakeGraph().start() if __name__ == '__main__':   StartServer()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河北区| 金寨县| 陆良县| 鲜城| 陈巴尔虎旗| 苍梧县| 峡江县| 上高县| 大方县| 普兰店市| 永顺县| 新龙县| 马公市| 乌苏市| 沙雅县| 大埔县| 凉山| 迭部县| 洛阳市| 南靖县| 桐柏县| 合阳县| 海林市| 托克逊县| 肇源县| 敖汉旗| 连城县| 大连市| 包头市| 阿鲁科尔沁旗| 修文县| 正安县| 浦东新区| 娱乐| 高安市| 韶关市| 迁安市| 稷山县| 广饶县| 黔南| 灌阳县|