Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Блоги > Alex Lexcuk

Оценить эту запись

Python сервер для локальных файлов

Запись от Alex Lexcuk размещена 28.01.2011 в 18:54
Обновил(-а) Alex Lexcuk 11.04.2013 в 19:53

Написал небольшой питон сервер для записи/чтения небольших локальных файлов.
Этот TCPServer можно использовать для поделок вроде редактора карт или самодельного граф редактора и пр. те вместо FileReference.save
Пользоваться легко, надо запустить командную строку, затем перетащить файл TCPServer.py в командную строку, нажать энтер, если на компьютере установлен python 2.6 в командной строке появится
Код:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

D:\FLEX\fileSis\lex\fileSis>D:\FLEX\fileSis\TCPServer.py
Server loop running in thread: Thread-1
теперь во флешке можно пользоваться такими штуками
Код AS3:
//просмотр файловой системы
var fileSis:FileSis = new FileSis();
fileSis.changeDirectory('');
fileSis.doneCallBack = navFileSisDoneCallBack;
function navFileSisDoneCallBack():void {
	trace('navFileSisDoneCallBack');
	trace(fileSis.curDir);//текущая директория
	trace(fileSis.pathArr);//архив с названиями папок
	trace(fileSis.fileArr);//архив с названиями файлов
}
 
 
//чтение файла
var fileReader:FileReader = new FileReader();
fileReader.startProcessReadFile('my file.txt');
fileReader.doneCallBack = fileReaderDoneCallBack;
function fileReaderDoneCallBack():void {
	trace('fileReaderDoneCallBack');
	//fileReader.totalByteArr - это содержимое файла
}
 
//запись файла
var fileWriter:FileWriter = new FileWriter();
fileWriter.writeFile('may file.txt', ba);
//тоже есть каллБак завершения записи doneCallBack
при передаче файлы кодируются по базе64, как-бы считывая файл, он считывается кусками по 131072 байт, тк. сервер и флеш сильно тормозит при передаче больших объемах данных по сокету. А записывается сразу без разбиения на куски (пробовал 5Мегабайт файлы) ошибки типа секуритиЕвенты иногда выплывают без всяких причин.

В демо проекте примитивный текстовый редактор (он сохраняет и читает файлы не только текстовые, но читает их как утф8, так-что если это был экзешник то он поплющится), кто-то чего-то себе удалит или перепишет важные файлы, я не виноват.
Там есть кнопки открыть, сохранить, сохранить как и окошко для выбора файла и перехода по папкам.


Новая версия (а старая то-же работает) в новой версии уже не кодируется по базе64, с флешевским Socket ниче не получилось из-за непонятного секуритиЭвента. Однако питон оказался хорош, питоновскому серверу можно обрашаться через урлЛоадер, отдавать команды или целые байтары в реквесте. В этой версии используется урлЛоадер.
Код AS3:
	public class Doc extends Sprite 
	{
 
		private var fileSis:FileSis;
 
 
		public function Doc() {
			fileSis = new FileSis();
			fileSis.doneCallBack = fileSisDoneCallBack;
			fileSis.changeDirectory('');
		}
 
		private function fileSisDoneCallBack():void {
			if (fileSis.operation == 'changeDirectory') {
				//fileSis.curDir
				//fileSis.fileArr
				//fileSis.pathArr
			}
 
			if (fileSis.operation == 'readFile') {
				//fileSis.readFileName
				//fileSis.readFileByteArray
			}
 
			if (fileSis.operation == 'writeFile') {
 
			}
		}
 
	}
В принципе ничего не поменялось, только все водном классе теперь, рус имена файлов не работают.
В деме граф редактор, загружать можно любые кртинки (jpg, gof, png) сверху на них рисовать и сохранять, но сохраняется только в png. (расширение дописывать не надо оно само прописывается)

Небольшой тутор-видио обзор
http://youtu.be/IXCzKYmVuLo
Вложения
Тип файла: zip fileSis.zip (62.5 Кб, 175 просмотров)
Тип файла: zip bitEditor.zip (53.8 Кб, 149 просмотров)
Всего комментариев 21

Комментарии

Старый 28.01.2011 23:42 in4core вне форума
in4core
 
Аватар для in4core
Спасибо хорошая тема.
Старый 29.01.2011 11:25 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Я чего-то не очень понимаю - зачем кодировать все в Base64?
А про разбиение на куски - разбивать надо в соответствии с MTU, который может быть от 576 до 1500. Соответственно, можно определить MTU для текущего соединения и пользоваться пакетами нужного размера -тогда никаких ошибок не будет.
Старый 29.01.2011 11:42 Alex Lexcuk вне форума
Alex Lexcuk
>>Я чего-то не очень понимаю - зачем кодировать все в Base64?
Если не кодировать в базе64, то не то что поток, а прямо водпад секуритиЕвентов сыпется, но если в конце нет нулевого байта, то секуритеЕрор 100%.

>>А про разбиение на куски - разбивать надо в соответствии с MTU, который может быть от 576 до 1500

Я вообще не знаю что это MTU, просто если допустим 5 мегабайт файл читать без разбиения, что мой компик с процом 1800Мегагерц виснет, приходится через диспетчер задач закрывать флеш плеер, а именно кусками 131072 байт, нормально, то-же подвисает, но более менее и где-то читал, что кратное 2 самое то.
А с другой стороны
Код AS3:
xmlSocket = new XMLSocket();
А я передаю бинарник, без кодирования в базе64 никак не обойтись, тк. xml это текст, а в бинарниках и нулевые байты и любые байты.
Обновил(-а) Alex Lexcuk 29.01.2011 в 11:46
Старый 29.01.2011 13:05 Котяра вне форума
Котяра
 
Аватар для Котяра
так делайте
Код AS3:
socket = new Socket();
Старый 29.01.2011 20:24 Alex Lexcuk вне форума
Alex Lexcuk
попробовал заменить XMLSocket на Socket, в сокете нет метода send, вместо него поставил
Код AS3:
socket.writeBytes(strBa, 0,strBa.length);
в итоге сервер получает данные, тк. он делает print в командную строку, а флеш тупит и ругается
Код:
Error #2044: Необработанный securityError:. text=Error #2048: Нарушение изолированной среды: file:///D|/FLEX/fileSis/Doc.swf не может загрузить данные из 127.0.0.1:843.
	at lex.fileSis::FileSis()[D:\FLEX\fileSis\lex\fileSis\FileSis.as:24]
	at DocManual()[D:\FLEX\fileSis\DocManual.as:22]
Но это ничего не значит, флеш по любому поводу эту ошибку выкидывает и даже без всякого повода.
Старый 29.01.2011 20:27 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Alex Lexcuk, он выкидывает эту ошибку только по поводу. но доку прочитать конечно же лень. так бывает.
Старый 29.01.2011 20:37 Alex Lexcuk вне форума
Alex Lexcuk
FP должнен выкидывать это ошибку по поводу, а если просто заменить XMLSocket на Socket, и появляется эта ошибка, то это глюк флешплеера, если ондолжен спрашивать у сервера
Код AS3:
policy-file-request
а он не спрашивает, а тупо выкидывает без причин секуритиэроры, то что с этим можно поделать.
В общем с XMLSocket работает, кодирует в базе64 и секурити эроров нет, так пусть так и остается, а с Socket выкидывает секуритиЭрор.
Обновил(-а) Alex Lexcuk 29.01.2011 в 20:40
Старый 29.01.2011 21:46 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
А если использовать FileRefference — вообще всё в шоколаде, никаких ошибок.
Старый 29.01.2011 23:19 Alex Lexcuk вне форума
Alex Lexcuk
Мне FileRefference не нравится тем, что надо каждый при сохранении или загрузке файла смотреть на панельку выбора файлов, а через этот сервер можно один раз выбрать и потом клацать хот кей или кнопкой сохранять, последние рабочие файлы сделать, в общем если проект не достаточно серьезный что-бы использовать аир, но хочется работать с файловой системой, то питон поможет.
Старый 29.01.2011 23:20 Котяра вне форума
Котяра
 
Аватар для Котяра
блин лень писать... поставьте мой сокет сервер да протестируйте.
Старый 29.01.2011 23:29 Alex Lexcuk вне форума
Alex Lexcuk
Да я хотел его потестить, но думаю на линукс переходить, а он для виндовса, да и разбираться что-то не тянет, я этот сервер на питоне ну очень быстро заделал, при том что в питоне практически на уровне скриптов для блендера3Д.
Старый 30.01.2011 02:51 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
мне кажется, что если у всех работает, а у Вас нет, то это никак не проблемы ФП =)
Старый 30.01.2011 15:23 Alex Lexcuk вне форума
Alex Lexcuk
Я не писал, что не работает, если время от времени появляется секуритиЭрор и это не влияет на работу проекта, те. он продолжает работать дальше, то это не "неработает", а это глюки. Возможно, что если более новый флеш плеер попробовать, то возможно будет другой результат, но проблем будет больше, тк. основная масса юзеров использует 10 ФП из флеш ЦС4.
Старый 30.01.2011 17:35 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Alex Lexcuk, человечество справляется и с более старыми версиями плэйера. в том числе и разработчики. я ещё раз намекну: проблема в вашем коде.
Старый 30.01.2011 19:32 Alex Lexcuk вне форума
Alex Lexcuk
Ага, спс. почти разобрался, упростил все коды, только для разбора с секурити евентом.
Код AS3:
package 
{
	import flash.events.ProgressEvent;
	import flash.events.*;
	import flash.net.*;
	import flash.text.*;
	import flash.utils.*;
	import flash.display.*;
	import flash.system.*;
 
	/**
	 * ...
	 * @author Alex Lexcuk
 
	 */
	public class SocketDoc extends Sprite 
	{
		private var serverURL:String = "127.0.0.1";
		private var portNumber:int = 843;
		private var socket:Socket;
 
 
		public function SocketDoc() {
			Security.allowDomain(serverURL);
			Security.allowInsecureDomain(serverURL);
			Security.loadPolicyFile("xmlsocket://" + serverURL + ":843");
 
			socket = new Socket();
			//Security.loadPolicyFile("http://" + serverURL+":843" + "/crossdomain.xml");
			trace("loaded policy");
			socket.addEventListener(Event.CONNECT, connectHandler);
			//socket.addEventListener(Event.CLOSE, closeHandler);
			//socket.addEventListener(ErrorEvent.ERROR, errorHandler);
			//socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
			try{
				//msg("Trying to connect to " + serverURL + ":" + portNumber + "\n");
				socket.connect(serverURL, portNumber);
			}catch (error:Error){
				//msg(error.message + "\n");
				socket.close();
			}
		}
 
		private function dataHandler(event:ProgressEvent):void{
			var str:String = socket.readUTFBytes(socket.bytesAvailable);
			trace(str)
		}
 
		private function connectHandler(event:Event):void{
			var ba:ByteArray = new ByteArray();
			ba.writeMultiByte('hello Im Alex Lexcuk', 'utf-8');
			socket.writeBytes(ba);
			socket.flush();
		}
 
	}
 
}
и питон сервер теперь такой
Код:
import SocketServer
import base64
import threading
import socket
import os


class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):

	def handle(self):
		data = self.request.recv(10000024)
		print 'flash data '+data
		
		if data:
			policiPos = data.find('<policy-file-request/>');
			if (policiPos!=-1):
				print 'received policy'
				cdp = 'cross-domain-policy';
				data = "<"+cdp+"> <allow-access-from domain='*' to-ports='*' /> </"+cdp+">";
				print data
				self.request.send(data)
				return 'null'
		
		self.request.send('fromPythonNoMessage');

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
	pass

def client(ip, port, message):
	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sock.connect((ip, port))
	sock.send(message)
	response = sock.recv(1024)
	print "Received: %s" % response
	sock.close()

if __name__ == "__main__":
	# Port 0 means to select an arbitrary unused port
	HOST, PORT = "localhost", 843
	server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
	ip, port = server.server_address
	# Start a thread with the server -- that thread will then start one
	# more thread for each request
	server_thread = threading.Thread(target=server.serve_forever)
	# Exit the server thread when the main thread terminates
	server_thread.setDaemon(True)
	server_thread.start()
	print "Server loop running in thread:", server_thread.getName()
	server.serve_forever()
Теперь скомпилированную флешку открываю в 9 плеере из флеш цс3 в логах сервера
Код:
Server loop running in thread: Thread-1
flash data hello Im Alex Lexcuk
flash data <policy-file-request/>
received policy
<cross-domain-policy> <allow-access-from domain='*' to-ports='*' /> </cross-doma
in-policy>
Те. плеер сначала прислал мой запрос к сокету, потом решил, а не получить ли мне файл полиции. И все работает, хотя должно быть наооборот, сначала файл полиции, а потом мой запрос.
Теперь эту же флешку открываю в 10 плеере
Код:
D:\flash\AC3\python>D:\flash\AC3\python\TCPServer.py
Server loop running in thread: Thread-1
flash data hello Im Alex Lexcuk
10 плеер уже на файл политики ложит, он ему не нужен, он показывает мне через секунд 10-60 секуритиЕрор.
Подожду 11 плеера может по другому будет работать.
Старый 30.01.2011 21:17 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
А зачем эти строчки?
Код AS3:
Security.allowDomain(serverURL);
Security.allowInsecureDomain(serverURL);
Security.loadPolicyFile("xmlsocket://" + serverURL + ":843");
Старый 30.01.2011 23:15 Alex Lexcuk вне форума
Alex Lexcuk
Эти строчки из адобовской справки, зачем они нужны надо спрашивать у компании Adobe.
Они нужны конечно что-бы не вылазили всякие всекурити евенты, но как показывает практика они нафик не нужны, тк. эти евенты всеравно вылазят.
Старый 31.01.2011 00:32 alatar вне форума
alatar
 
Аватар для alatar
Код:
self.request.send(data)
Эта команда добавляет нулевой байт в конец сообщения?
Старый 31.01.2011 00:36 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
@Alex Lexcuk, я таких строчек никогда не писал ... и никаких ошибок безопасности всё равно не получал ...
Старый 31.01.2011 12:54 Котяра вне форума
Котяра
 
Аватар для Котяра
Security.loadPolicyFile - нужен если кроссдоменник отдаётся не с 843 порта.
Старый 31.01.2011 20:13 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Я последнее иногда использую чтобы заранее загрузить кроссдомейник ещё.
Не помню зачем, но когда-то надо было.
 

 


Часовой пояс GMT +4, время: 03:41.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.