- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Flash cho phép gửi và nhận dữ liệu giữa 2 files swf riêng biệt, tại sao lại làm được như vậy? Chúng ta sẽ hiểu điều này như thế nào?
Các file swf chạy sẽ được quản lý chung bởi Flash player, chúng đều truy cập được đối tượng LocalConnection nhờ vào đó mà các files bắn thông tin tín hiệu được cho nhau. Trong bài viết này mình sử dụng 2 file swf, một file gửi dữ liệu và file còn lại nhận dữ liệu.
– SWF gửi dữ liệu đi có tên xác định và gọi hàm callback của swf khác để nhận dữ liệu. Dữ liệu gửi đi sử dụng phương thức send
. Bạn có thể gửi nhiều dữ liệu vào đối tượng global LocalConnection, với mỗi một dữ liệu được gán với một tên riêng biệt có thể cùng callback hoặc khác chứa trong swf nhận. Ví dụ:
var localConnection:LocalConnection=new LocalConnection(); localConnection.send("connecter","showText",txt_mc.txt.text);
– SWF nhận dữ liệu, sẽ kết nối vào thông tin dữ liệu từ swf phát dữ liệu thông qua tên dữ liệu. Như ví dụ trên, thì tên dữ liệu gửi trên đối tượng LocalConnection là “connecter”.
Khai báo SWF client nhận dữ liệu với LocalConnection, để xác định và gọi callback từ tên dữ liệu được gửi bởi SWF truyền dữ liệu.
localConnection = new LocalConnection(); localConnection.connect("connecter"); localConnection.client = this;
Bạn có thể kiểm tra dữ liệu gửi đi có hoạt động không, cho SWF gửi và nhận với sự kiện StatusEvent.STATUS
. Thêm sự kiện StatusEvent cho instance của LocalConnection.
localConnection.addEventListener(StatusEvent.STATUS, onStatus); private function onStatus(evt:StatusEvent):void { switch (evt.level) { case "status" : trace("LocalConnection.send() succeeded"); break; case "error" : trace("LocalConnection.send() failed"); break; } }
Ví dụ tiếp sau đây, mình gửi văn bản của TextField nhập thông qua người dùng và truyền trực tiếp vào TextField trên SWF khác. Bạn gõ thử chuỗi trong SWF dưới đây, sẽ thấy chuỗi đó xuất hiện trong SWF nhận.
SWF Send data
[kml_flashembed movie=”https://img.hoangweb.com/2014/09/Sender.swf” height=”450″ width=”500″ /]
SWF receive data:
[kml_flashembed movie=”https://img.hoangweb.com/2014/09/Receiver.swf” height=”450″ width=”500″ /]
SWF gửi và nhận không nhất thiết cùng chạy trên trình duyệt vì nó đều chạy qua flash player nên có thể chạy swf trên desktop bằng cách nhấn đúp vào file và file swf nhận dữ liệu như bình thường.
Tải demo source code LocalConnection-AS3
Kết nối tới SWF khác domain
Flash cho phép truyền dữ liệu với 2 SWF nằm trên các trang web khác nhau, khác domain thậm trí mở với 2 trình duyệt.
Để làm điều này bạn thiết lập domain cho phép dữ liệu nhận của đối tượng LocalConnection bởi phương thức allowDomain
. Khai báo cho phép kết nối vào domain của SWF cho, xem ví dụ sau:
SWF nhận dữ liệu trên www.domain.com>
var conn:LocalConnection; conn=new LocalConnection(); conn.allowDomain('www.otherdomain.com'); conn.connect('connectionName'); function methodName():void{ trace("hello World !"); }
SWF phát dữ liệu từ www.otherdomain.com
SWF cho phép gửi thông tin dữ liệu tới một domain khác, điền tên domain trước tên đối tượng bằng dấu hai chấm “:”. Do vậy, chỉ domain này mới có thể nhận được dữ liệu.
var sendingLC:LocalConnection; sendingLC=new LocalConnection(); sendingLC.send('www.domain.com:myConnection', 'myMethod');
Nếu muốn nhận dữ liệu từ nhiều domain mà swf đang truyền đi, thay vì chỉ định một domain vào hàm allowDomain, chúng ta sử dụng ký tự wildcard để có thể lấy nhiều dữ liệu từ nhiều domain của swf gửi đi chứa trong đối tượng global LocalConnection thuộc quản lý flash player. Ví dụ sau swf có thể nhận dữ liệu trong mọi domain của swf gửi tới nó.
//swf nhận: wwwp.domain.com conn.allowDomain('*'); conn.connect("_connectionName"); conn.connect("_connectionName1"); //swf 1 gửi: www.otherdomain.com conn.send("www.domain.com:_connectionName","myMethod"); //swf 2 gửi: www.otherdomain.com conn.send("www.domain.com:_connectionName1","myMethod1");
Hoặc nếu swf gửi không chỉ định domain có nghĩa mọi swf có thể nhận được dữ liệu từ nó.
//swf gửi conn.send("_connectionName","myMethod"); //swf nhận conn1.allowDomain('*'); conn1.connect("_connectionName");
Trong ứng dụng AIR có khác một chút, nhưng mình sẽ đề cập trong bài viết sau.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype