Some time ago, I saw someone mention on flashseer: SWF files can be transmitted through socket, so that users cannot obtain the SWF files... At that time, AS3 decompilation had not been released, so the protection of the program was not concerned. With the development of decompilation programs For the common people, friends who don’t want others to see the source code are more anxious...
The idea of transmitting swf files through sockets to avoid leaking source codes (only applicable to as3): Let the loader of the main program (front-end swf) connect to the server through sockets The background program then requests the required main program file. The background reads the main program data and sends it to the loader of the main program through socket. The front-end swf applies the Loader.loadBytes method to display the main program file.
The following is the source program for the test:
package { import flash.display.Sprite; import flash.net.Socket; import flash.events.*; import flash.errors.IOError; import flash.display.Loader; public class SocketTest extends Sprite { public function SocketTest() { var socket = new Socket(); socket.connect("localhost", 5277); socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); var response:String; function writeln(str:String):void { str+=""; try { socket.writeUTFBytes(str); } catch (e:IOError) { trace(e); } } function sendRequest():void { trace("sendRequest"); response=""; writeln('bin'); socket.flush(); } function readResponse():void { //接受数据 var str:String=socket.readUTFBytes(socket.bytesAvailable); response+=str; //当数据以end结束的时候,数据传输结束 if (StringUtil.endsWith(str,'end')) { response=response.substr(0,response.length-3); //把字符串转换为ByteArray var ba=Base64.decodeToByteArray(response); //trace('bytearray=====',ba); var l:Loader = new Loader(); //从 ByteArray 对象中所存储的二进制数据中加载。 l.loadBytes(ba); //trace(l.content); addChild(l); } } function closeHandler(e:Event):void { trace("Socket closed! "); } function connectHandler(e:Event):void { trace("Socket connected!"); sendRequest(); } function ioErrorHandler(e:IOErrorEvent):void { trace("IOError!"); } function securityErrorHandler(e:SecurityErrorEvent):void { trace("SecurityError!"); } function socketDataHandler(e:ProgressEvent):void { trace("Socket have data!"); readResponse(); } } } }
PHP:
//后台scoket程序,由于适用php写比较简单,就用php写了. //error_reporting(E_ALL); error_reporting(0); set_time_limit(0); ob_implicit_flush(); $address = 'localhost'; $port = 5277; if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo 'socket_create() failed: reason: ' . socket_strerror($sock) . '\n'; } if (($ret = socket_bind($sock, $address, $port)) < 0) { echo 'socket_bind() failed: reason: ' . socket_strerror($ret) . '\n'; } if (($ret = socket_listen($sock, 5)) < 0) { echo 'socket_listen() failed: reason: ' . socket_strerror($ret) . '\n'; } echo 'connect…………….'; do { if (($msgsock = socket_accept($sock)) < 0) { echo 'socket_accept() failed: reason: ' . socket_strerror($msgsock) . '\n'; break; } do { socket_recv($msgsock, $buf, 2048, 0); if ($buf == "") { socket_close($msgsock); echo "some one quit"; break; } else if ($buf == "bin") { //读取主程序数据 $f = fopen('main.swf','r'); $data = fread($f,filesize('main.swf')); fclose($f); //转换为字符串 //echo base64_encode($data); $talkback = base64_encode($data).'end'; } //发送 socket_send($msgsock, $talkback, strlen($talkback),0); } while (true); socket_close($msgsock); } while (true); socket_close($sock);
For more articles related to PHP and flash as3 socket communication and file transfer implementation code, please pay attention to the PHP Chinese website!