Flash的几种通信方式《转载》_音箱_音频应用论坛 - Powered by AUIOAPP

音频应用论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
热搜: 音频应用

[其它相关] Flash的几种通信方式《转载》

[复制链接]
stuv485 发表于 2015-12-23 08:39:29

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
1. SWF间的通讯——LocalConnection4 @/ {0 `6 o. n- u0 g9 t8 r

4 p" ~- ?. w: u! i在同一台机器上运行的两个(或多个)swf,可以使用LocalConnection进行通讯。可以有多个发送端,但接收端只能有一个。+ }3 |9 z2 n9 `- p6 C0 {. G( ~

9 }( Y8 R, u$ u在发送端定义LocalConection,连接接收端通道,使用其send方法发送信息。在接收端定义LocalConnection,打开连接通道,定义信息接收函数。两个flash之间就可以进行通讯了。
- R- L' n, h+ K! G. Y4 C
- V- a  v% x" \: J8 n示例浅析:
/ c6 O( T+ }% ^% h/ t+ a# p1 u
! N( ~& C1 H% R! d; z, a5 N' J/ Y接收端:( c/ ?) y; f0 M" w5 b

5 @' J. f+ M/ u3 X' o3 w//创建接收端本地连接 private var _recive:LocalConnection = new LocalConnection(); //定义连接通道 private var _channel:String = "_connection" //打开通道 _recive.connect(_channel); //设置接收者为本身 _recive.client = this; //定义信息接收方法(由发送端调用) public function reciveTest(_name:String):void {              var _text:TextField = new TextField();              _text.text = "接收端,收到信息:" + "\n" + "Hello," + _name;              addChild(_text);              _text.x = 10, _text.y = 10; }
$ U6 ~) {4 X: }  A4 B
4 _  W! ~+ Q! S5 L: B, f# G发送端:. S  g" m' [5 h  f2 V9 ?! J
0 W& j7 ~& a% |5 _8 ~
//创建发送端本地连接 private var _send:LocalConnection = new LocalConnection(); //定义连接通道(名称要与接收端的一致) private var _channel:String = "_connection"; //建立连接 _send.connect(_channel); //发送信息,信息接收函数为接收端的reciveTest,传递参数"tata" _send.send(_channel, "reciveTest", "tata"); //运行时先打开接收端swf,再打开发送端swf。* W$ }- U+ Q1 c/ t4 S: a; q' z
* u' A, P' ]8 _% I, I# Y; m$ }  M
9 {  M5 @( t  p. J/ l4 R
4 [; l! v( f2 ~9 K( G
2. Flash
' m/ c0 ]% R, D" P
. F; Z! m4 n8 o本地共享对象SharedObject# z: g1 C& z2 V( l2 E1 L5 F- a
* `+ u9 }! U$ e1 u' g( h
ActionScript
* s$ Y1 v& C0 H
4 B. f; e* ]. k- ?+ `/ d1 h. N中, SharedObject
+ _/ I# Z6 p8 `, M' ]# F- |) p; }: @$ B
类实现了客户端机器数据的持久性存储。本地local shared objects (LSOs)9 I; ~3 ]6 I' S* a  R6 S+ f) g- Y
$ E% |8 F% |( @3 h5 Z5 Y- g. N
,很类似于浏览器中 cookies  n4 J* h1 @# u; m. i& I

" Y' E9 E: K& e; o8 a9 U% c,可用于存储用户名,游戏数据等。8 o5 O: z% I: A8 S. I: |
1 V: Z3 {1 O& |! n: ^7 Q  K$ g
LSOs
! j0 A. b; i5 s; i3 {7 \% G0 n4 S" _0 {) H. a" {
通过SharedObject.getLocal, a; _4 \) c% `* s; L+ D
( |$ {# g0 R2 {! {" U
创建或打开。
5 n0 W, T9 Z+ e4 x
2 {4 U" u. C2 E' f/ |7 X用法:+ O1 G2 ]/ L: n6 S. f7 X+ j8 y3 [
+ k5 c3 U. K- h, o( O$ v) f1 N/ q
var so:SharedObject = SharedObject.getLocal(name:string, localPath:string = null, secure:Boolearn = false);& \) `' C( G5 y4 ?) E! F

3 M+ n" L; M* M& [" l5 c! R如果共享对象已存在,将返回SharedObject
5 {) g  Y% i# U# E, c+ g. `5 h2 _5 e( v% X. j- p& e
实例,否则根据名字创建新的。可以通过so.data.someData+ v- J* z3 q: N$ n6 S7 j9 z
4 w7 R. k) ?5 q/ o# @
的形式向so
' Q6 b$ `* f; P2 h, K
8 ?4 L/ @* _' \2 D2 q) o中写入或读取数据。若要删除共享对象的值,要使用delete! y! |  o1 ?) N$ D' u/ r

/ W/ l) g( f* u  Z2 a) V方法,如delete so.data.someData- X; ?9 ~3 g7 H1 q, M$ q# l
  O& A8 Q9 C, Q1 @% S( v
,若要删除整个共享对象,则调用其clear()6 P7 T0 _+ P/ o! I6 j% \- d
; g3 M" o9 H; B) F( j+ t
方法,如so.clear(). i9 Y9 V, J6 u/ m! C# X

0 n; H- z' s( U  L9 X+ c, Y' u
; o9 L: V% x% C3 U$ r5 U" d. A! w' C( q
若要使同一个域的swf
! X8 n& K* K6 X' M) l6 N. ^
3 O6 Z- ~' B/ _1 c2 ^访问同个本地共享对象,可以通过设置getLocal
# I$ n: z3 {* Q* \0 ^( _0 O2 \' V# d$ p% U% O" ]. J" D1 \
的第二个参数实现。该参数为绝对或相对路径字符串,指定LSO2 s$ I4 f4 f: P4 V& S; X* h6 @

, W  Y: q/ Q8 Z1 |5 ]1 E* h的存储位置。
/ R6 D  m7 m( v, c- x, r% _9 t6 T3 R9 T! Z3 a( e- F0 `" f
示例浅析:
1 G) }: N! G+ v$ I/ ~0 a; A7 F' Z+ ]! }; r
以不同swf% I. A3 ?- i9 |/ u4 p, J- K# J2 E
) C7 _8 s6 x7 z$ I# ]2 b
访问同个本地共享对象为例6 c/ i! b/ o0 k; _/ j+ d4 T% ~
/ O7 X  ^6 P/ x! b* L; ]
//写入端: private var writeSO:SharedObject; //创建本地共享对象mySO writeSO = SharedObject.getLocal("mySO", "/"); //向共享对象写入数据 writeSO.data.nameInfo = "Hello,tata"; //读取端: private var readSO:SharedObject; //打开本地共享对象mySO readSO = SharedObject.getLocal("mySo", "/"); //从共享对象中读取数据 trace(readSO.data.nameInfo);# q+ b1 E' i2 V6 }$ s7 [
/ ~: L- T6 e4 v
3. Flash
' {2 x4 j. C( C5 c& p8 k
9 g' f; o/ P# u( P1 S' ~与JS
* b% Q* \* E% f$ O5 E( ^# Q1 ^" R* Z+ [
交互
1 y' I% p8 \2 R. W; T( P$ Y
6 Y- H, d* A% o. ^       ExternalInterface! E, ]+ D! F* |
% V$ r6 L. @3 T
类允许 Flash
8 a) a! P& Q/ }& e7 I! W
6 k2 h+ ?% m) u$ |7 K7 ~播放器以异步的方式与宿主程序进行通信,宿主程序一般指的是Web
" C1 D  j" F' m6 h6 j5 c
5 _) K# z# ~; t2 L9 g  S2 ?* @浏览器。3 T1 I, Q& @& s4 P4 l" C$ s
% A2 f% Y( Z% a2 C) r
       ExternalInterface' o, {( N1 ~+ z. K2 W/ y1 G0 I" h9 ?
# J- E' V; N3 i, K# K, I4 {4 \) v+ D
支持以下浏览器:/ s" M- l3 S$ T# x

+ p; S2 T: p. Q7 U( U5 q' YInternet Explorer 5.0+ (Windows)
! n" ?6 T$ \$ [4 `/ w7 E8 [  R: Q, c, [$ f
Netscape 8.0+ (Windows and Mac OS X)
, ]& T/ _+ f8 s. y  p2 }9 @
) w# x4 w8 Z& A% }, zMozilla 1.7.5+ (Windows and Mac OS X)
% r+ Y! [) u3 d5 D. Q: W" i$ t1 s: r" k9 ?6 s) s! R
Firefox 1.0+ (Windows and Mac OS X)/ }. w9 O# K7 }

, X% J" e- [( I1 O0 Z7 s! cSafari 1.3+ (Mac OS X)6 \  `' {/ C9 ~

. H6 U; p' X; r! E  d5 ^ActionScript7 F. G7 x" f3 I4 C5 V$ b" T3 G, a
  K3 L8 o- ~" c" e5 |; G# p6 {
调用JavaScript* ^3 j$ Q2 P) r) `' t9 w# S! l
* a& F- o/ ?3 W# ]& H7 O
函数,可使用ExternalInterface.call()% L% d7 G: x+ X. N; y

% p* ?+ D6 Y) J" z0 B。该方法采用异步调用JS$ F' Q7 W* t& N& P5 O
: ]0 E0 }" D6 A
函数机制。用法:ExternalInterface.call(JS
" _/ p, J& s1 V! y7 \5 m) d& |
- D# v$ Y0 H& J; P方法名:string7 d6 J% t. z9 H9 l$ n

* @7 o2 I! l  T[,参数1; g) s# k4 R7 @" O, ^6 l3 f

  l* ]) P* V* L5 S$ A:*,
  t3 \$ Q: w' T3 o+ g5 w! o( z% i4 V# m' B0 k! F
参数2. y4 b) a& B$ D* E  W3 L: S

5 X- U5 Y" f5 S& O% w6 n:*/ ?1 j! D# r, d' J9 P

- Y2 J; E/ ^, C  P8 C3 l& H; G……])) Z. g; ]# U( z

& l2 I' K* ^4 t, l# u+ m。如果JS
# T% A3 o% y, o5 f9 C3 G! J& r1 y( S
- _1 Q. Z- H6 p函数有返回值,可用变量存储:如var str:String = ExternalInterface.call(“jsFunction”);
) G' K& [; R! R" E
5 G7 j4 {$ k8 h3 j: i4 P; \" f可以用ExternalInterface.available
5 E" S! U! |! e# W4 Q& j1 L
4 L' P% \  }0 D: O! i4 S0 R查看浏览器是否支持,若不支持,可使用navigateToURL()' A3 x* l; a- h: I% u- P
' f# J2 `8 s: h
方法。
* g7 k) L$ a! A1 ]1 v) t9 N# P3 N# J
6 }. ?" X4 z" }5 S1 |8 {: h用法:+ J* r) O+ j8 |9 y
6 n% E: ^: Q8 L2 f0 B- A* s
var request:URLRequest = new URLRequest(“javascript:JS
# N* }* Y5 P( E2 `8 Q/ Q* E- D0 @& j, \& M9 g. M& u
函数($ @' W7 I, Q' u7 J. Z& U' W

+ G7 c/ h! l; F# X0 {" Y传递参数)”);
+ c' q& w' m$ R: j, O9 o, ~4 H  y8 P7 j& \1 p, E( ?7 {
navigateToURL(request);
: s/ ^5 t2 y' s- p! i* ~% Q: a" Y/ ]% D3 N, G% U
但使用这个方法没有返回值。; |6 K8 y, K8 F$ o' ], p: F
+ E  d  K# |2 [4 J) B, L- e3 V
两种方法都在flash.net1 Y$ E% {! M6 J

, H: q0 p# R7 f, Z% i6 p包下。1 B" n' Y) L4 R! q# X

! `* c2 Z' J' I6 w9 n. {$ e/ {3 OJavaScript
8 f' E- o- b% \) z, l! M4 Y
+ ?0 F9 N2 t. I9 S, D5 z2 t2 n调用ActionScript2 h7 [7 ?" Q- O4 t
/ U& }0 ]' X2 n, C, E5 D
函数:使用ExternalInterface.addCallback()
" c. i( ~% H, O6 Q2 D1 S4 v- T. S& R; b7 O; z
注册AS
1 z1 J! i. h) O0 [7 T* v. _$ a8 e9 n( P# m/ J4 ]6 I
函数,然后在JS1 O3 o2 p9 o. ~
6 x+ p- k9 ]! u% x! H
端进行调用。用法:ExternalInterface.addCallback(
. K$ ]( V" f% O3 F8 l) F2 p
) Z0 I) ~5 q8 e' Y# n被调用函数对JS
. J' d; q3 z& i8 |' S5 C/ X2 S; S
的别名:strin
" H1 j5 a; a3 f! N, R0 f" R6 U6 I
,被调用函数:function)
" s# A. x3 f4 W
' i' `$ u5 S3 f' h# W; E/ b: A; |。如:ExternalInterface.addCallback(“helloWordAS”,helloWord);4 e9 M! C3 {' }
" Y6 H) d& [6 t& R" M

5 E( ^' M% j* k/ p- S; n. I* h0 H/ U0 W! ?5 J  U- S
示例浅析:3 v: _* n. ?2 D9 u; I, \

5 N; l( ?: M8 _1 R& G* NAS端: if (ExternalInterface.available) {   //注册js回调方法clientFunction,"jsAlias"是clientFunction在js中的别名   ExternalInterface.addCallback("jsAlias", clientFunction);            if (ExternalInterface.call("isReady"))   {     _txt.appendText ("可以发送数据了!")     sayHello();   }else {     _txt.appendText ("等待发送数据...\n");     setTimeout(sayHello, 2000)      } } private function sayHello():void {   if (ExternalInterface.available)   {     //使用ExternalInterface调用js方法jsFunction,传递参数"hello,tata"     var str:String = ExternalInterface.call("jsFuntion", "hello,tata");     _txt.appendText(str + "\n");   } }
2 E( X* H  L( K# v. m+ [1 X
! U8 G6 W* [2 T- ~7 Q) \//js回调方法clientFunction
0 Z. }8 j1 S, u6 T0 w! h- ]$ e8 k: I% X% L! C
public function clientFunction(str:String):void7 h5 L) z# T2 R& ?

' K5 C" B- `- {3 S6 S4 k" q{
: o2 ]3 }, Z/ h  H* y# K4 R: X8 e8 H0 P2 F/ M4 v4 r, y. }
       _txt.appendText(str+"\n");. j5 i) `' G, D
) z$ `) D6 R8 |- ^/ t' N' r# ^1 u
}1 n) y5 T& u; @4 N+ V4 q, h

  `8 U, g) e9 D) t4 B' jJS
2 I  R( [) p0 s) w2 G" F2 ?
4 J6 f% R+ V* u% m3 c0 Y端:, b0 F! _) O& \
6 ~6 J) p+ |) h/ A' q* ?
var jsReady = false;      function init() {   jsReady = true; } function isRead() {   return jsReady; }      function jsFuntion(msg) {   alert("来自AS的消息:"+msg);   this.sendToAs();   return "这是调用jsFunction返回的"; }      function thisMovie(movieName) {   if (navigator.appName.indexOf("Microsoft") != -1) {        return window[movieName];   } else {     return document[movieName];   } }      function sendToAs() {   //调用AS方法   thisMovie("tata").jsAlias("此信息来自JS!"); }; Y' c3 r9 t) d6 l7 b1 z/ R

( v1 J! l, F% D" x2 o
7 ~6 x0 w9 K/ w! W- w
+ ~) E* f: {: Y, @4 ]& Q先编译出swf
+ M5 B3 G( Y  V$ d: Q( N$ x  A" S! b& U. k! C$ i! {0 M! M& c
,再打开index.html7 e: T7 Z+ S' F+ n

  K! T0 q+ G4 [+ {1 x$ ^才能看到结果,因为flashPlayer
0 E5 H; I, j$ b! Q
  G; N% R4 T: G2 ]  ]4 a# a0 r" s不支持ExternalInterface
+ G& W3 g, O0 Q: j6 e0 O9 W( L0 k. d; o2 h& Z
,要有浏览器包装。6 S2 ~+ E9 r( y# Y3 z! L
5 X8 t! l9 L9 ]! E. U/ A
% y$ ^( U7 O9 p9 A4 B* N+ r

) A+ o' X- `. R0 z' H4.
5 v) o$ L5 w1 G  h8 Y# x4 P+ Y/ P3 A) G' W
使用HttpService
# Q, S/ x. M  k" y: W7 R" k
& U* e& p! l$ V' C5 R) e: c' `, `5 k连接服务器- m" X7 C5 c) R+ }
; b- L& t! s6 S- \" ]
      ) z9 D: l( A" }5 u7 C

9 n$ m1 J, A. b) k; @" k/ c1 L如果想发送数据给服务端脚本,可以创建一个包含数据的URLRequest
% Z( Y! E5 Y3 h  T/ s
( M. C- I9 ?6 f: ~3 B$ J, [3 t+ w实例,并用flash.net.sendToURL(): S% y2 [, @1 d+ E7 Q' n8 s9 d8 y$ P
$ d! E; m+ K. g" o5 G- Z* g, |, u/ h
或flash.net.navigateToURL()% d6 G, p9 R  _+ z. [5 @* T

+ Y0 W! R1 I5 _方法发送出去。5 c4 m5 f5 ?* b) L, D6 f/ m1 |; ]! k
3 ^1 }9 R3 Z% x! v* X+ F0 i
用法:0 T* n7 ]; z' b6 ^6 P3 k) N, x

/ B3 @. f/ E5 }9 O- S1 h - f* y8 q9 J9 T6 y. D

0 e( C/ k" I6 W0 Avar request:URLRequest = new URLRequst(服务端脚本路径:string); var vars:URLVariables = new URLVariables(); vars.someData = “tata”; vars.someNumber = 10; request.data = vars; request.method = URLRequestMethod.POST或URLRequestMethod.GET; sendToURL(request);或navigateToURL(request[,”_blank/_self/_parent”]); 示例: //设置传递参数 var myVars:URLVariables = new URLVariables(); myVars.name = "tata";         //创建URLRequest对象 var request:URLRequest = new URLRequest("http://localhost/HttpServerConnect/test.php"); //设置传递模式 request.method = URLRequestMethod.POST; //设置参数 request.data = myVars; navigateToURL(request);
. @+ ~2 e8 e) `) a! m+ F+ j. f) d' ~) b0 F+ O# V
默认情况下,数据是通过HTTP POST) m, D, L- X6 X, P, G1 s1 ~; X  Q
$ V2 Q+ |/ X& [% E
方式传输的,URLRequest
/ e1 p0 x5 K/ W; Z; R1 m6 x3 W3 ?* }1 @
的method
4 r2 O5 K, C9 n# Q, F% \, U6 x( ^6 K; p
属性指定数据的传输方式,URLRequestMethod.GET3 t1 V4 Q( P; L* I

6 Q6 O  Q# `3 v  {0 m指HTTP GET
, ?/ T' B. @+ T0 {: e5 N  Q! u1 o9 ?+ i6 F6 r- h6 S- S4 }
,而URLRequestMethod.POST
1 A" t& T" w: u6 Y/ P
4 c: T; Z! Z8 @& Q( t+ F/ D指HTTP POST
: y% ], g/ s; r* l; G+ L, `* G
* X/ \7 z: F+ x, r+ ]: [; ]。URLRequest
. E3 q1 M) @* \7 z* W' ~  e* h
7 d' B: Y# Q" a% E1 S的data
3 r4 e! s' H; Z: `( u. f+ S
  `, T; K& [& M  G$ V属性设置要发送的数据,如果是URLVariables
* x+ `6 }2 R) U% K
- ^4 l5 S  K1 f; _. Y实例,则发送名称/6 B) Z$ l- L- r! a: i% E1 j1 h  X
  [' h3 F7 Z5 L% w! c
值对到服务器,也可以是flash.util.ByteArray
; f& d7 n7 o/ T4 a. Y* V+ W3 ~6 L# |1 ?' T* `
,通过HTTP POST. R9 P! Q& T8 Z

3 U( X' C: v4 x* ^8 \8 t方式传递二进制数据到服务器,或者是String
% f. i4 V6 s7 ~" k1 ]" B
. u; o# q0 i, E  F( r类型的数据作为XML-RPC
9 V; V8 |4 x& o  o' O( _4 k; M4 K: e, z" J1 I1 J" k0 P& l5 H
请求发送到服务器。. k1 h: B  _) {5 Q
. K. _* g& e% W& G$ V
当需要处理服务器返回的结果时,应该使用URLLoader.load()
5 I9 V" ]9 o" D% c
& i* _* O) R8 ]方法。通过侦听Event.COMPLETE
0 b4 c# E# |+ t8 g3 s: H  m
* C; {/ E" h$ Y: g4 k( S事件,在事件处理函数中处理服务端返回的结果。' p7 t1 ]6 N; q) {/ r7 N
: C/ B/ x2 J* U
用法:
2 c3 h& k0 z& L5 m: L9 ?
1 g6 E2 Q) V( w0 \) h; ~1 n , y) u( n2 ^3 \0 H# d

# d% [7 a# R( z3 R8 Qvar loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListerner(Event.COMPLETE, loadedHd); loader.load(request); 示例: var myVars:URLVariables = new URLVariables(); myVars.name = "tata";         var request:URLRequest = new URLRequest("http://localhost/HttpServerConnect/test.php"); request.method = URLRequestMethod.POST; request.data = myVars;         //创建URLLoader对象 var loader:URLLoader = new URLLoader(request); //设置接收数据方式 loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, loadedHd); loader.load(request); private function loadedHd(e:Event):void {   trace("Hello,"+e.target.data.flashData); }
# ]. c- d# p+ z6 z9 w0 S, t# M- q
; k7 m/ r/ j% g( m6 z
; s' N; u- E7 E# k
服务端:, j. L/ Y7 I- }5 }% |; V9 ^+ _
, b' @7 D9 G. ?1 U3 H- M/ U$ g0 I$ e
5. 使用WebService连接服务器: t& F) Q( A& r8 m& Q, j
- t) W$ a# @& m2 R2 h2 }% `$ O
       通过web services,可以使用其他网站提供的服务,完善自己客户端的功能:如加入天气预报,提供在线翻译,股市信息等。
+ q2 \* P8 ^1 a. t. O# H% e4 V
. \7 X* a2 Q. n9 S0 `       web services采用异步通讯。在调用web services对外提供的接口之前,要先加载其wsdl。5 a- E. O, x7 N9 D

, {4 ]' A8 F- a1 wFlash播放器没有内建的web services支持,可以通过导入mx.rpc包引入调用web services方法。
5 @3 {& V' U9 ]
& J8 {4 O2 f& B3 \* l示例浅析:
; k' ?% h" v4 L+ n* ^$ s
6 z$ u6 {- V0 L  {( f1 |- k0 A以调用天气预报接口获取天气预报为例。例子使用的是www.webxml.com.cn提供的天气预报web( B( y4 F. K6 \9 t% q$ Z0 [
6 Q3 `7 }. J, U. A4 b' T
服务。+ z1 T  M/ H8 B& t) E; I5 d& R

2 ^2 @" z, R# Q2 B9 J//创建webServer对象 private var webSer:WebService; webSer = new WebService(); //webServer路径 webSer.wsdl= "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl"; //调用webServer的方法前要加载其wsdl webSer.loadWSDL();         //添加侦听器 webSer.addEventListener(LoadEvent.LOAD, wsdlLoaded); webSer.addEventListener(ResultEvent.RESULT, resultHandler); webSer.addEventListener(FaultEvent.FAULT, faultHandler); wdsl加载完毕后,才能调用webService的方法。在resultHandler事件中处理返回结果,在faultHandler事件中进行错误处理。 //调用webServer提供的外部方法getWeather webSer.getWeather({theUserID:"",theCityCode:”上海”}); //输出返回结果 private function resultHandler(e:ResultEvent):void { for each(var s:* in e.result) {   for each(var s2:* in s)   {   trace(s2[1]); //输出查询的城市 trace(s2[3]); //输出最后更新时间     var arr:Array = (s2[4] as String).split(";");     // 输出具体天气情况     for (var i:uint = 0; i < arr.length; i++)     {       trace(arr + "\n")     }     break;   } } }7 T9 ~" \3 T; ~
- j) h/ \  U2 W5 v

% ]+ [/ p5 P' {4 j' \% F* P/ ]9 U& X* U" _) x" W" {; }" P; w7 [5 G1 W
6.
1 O4 z- ?  {3 K: X1 M) O% T0 g/ n- @0 [
使用Flash Remote
+ u6 m) [5 F% d" t; s
: g8 K* Y7 u5 I. c: G& C" W% L连接服务器9 d9 j, n( `; m: ]  l! g
# U9 s# G5 z9 L  s
Flash Remoting* g! Y9 g/ T/ ?5 V+ R9 C( f
6 U% P" n- p4 _, _5 D4 E% W; X
通过 HTTP1 f' ^# a7 M9 K8 q8 [: X3 T: [
1 T* t: J2 R' I+ U
通讯,采用二进制数据协议,称之为 Active Messaging Format (AMF)9 I3 a9 {/ N: ~" S. g

" W& x( Q/ w* W8 y2 I7 \。可以传输更多的数据,效率比起web serverices
! C& C: \$ L9 E" V. P' e1 B: k
5 n/ k4 ^* ]5 R, A6 B: }5 n更高,速度更快。Flash Player.
  `$ h& ]4 u' ?5 e  J1 z& }* p7 I  }  p: d- j
支持 Flash Remoting2 s' a% v8 X% W6 B: o

! j9 w# c! ?2 ]# W
. u0 D& X8 J1 y3 Q6 i0 N8 k! p7 o' H" G- C* W) O! ?' N( {* E% Y+ e3 j
Amfphp是一个PHPRPC工具箱。可用于PHP与Flash和Flex之间利用Remoting进行交互。
. S) \9 N& S# q
# }6 @; a$ E  m4 h环境配置:1 _+ ]. N( S" a/ I. Y  m
  M0 O& h( K: V, V5 }$ Z3 P
下载安装php安装包。" ^. ~0 p, w; T( L8 q! z
! p; Y/ o1 d3 V7 D
amfphp
  Y! n  q  \8 w# Y1 ?& H2 L. k$ a. q! f  Q% j- w
安装配置:
. _8 d9 q0 q$ N
8 v% d3 U' }" e, |% k1.      , s, E; a1 s% L  j* T  f7 O7 e

( Q2 r3 J3 P$ U/ ?& L: N* [6 t, [/ t下载安装Amfphp$ {' d. }+ b: |5 Y! u5 h- D( \, |1 F
; {8 r' q8 ~3 @% M0 g
:可以到http://www.5etdemi.com/uploads/amfphp-1.9.beta.20070126.zip
( r1 D' J8 q- ]1 i2 N4 ^3 V" T* d6 S8 e0 e/ D! [. [
下载,将其解压到你的php6 b; F2 }5 g* [! g! X$ L) R: W3 Q

, }- X* I6 K6 q5 j) r网站根目录下。1 m% v. P: k4 s
0 S" `# `3 I8 S; W4 [
2.      
. d3 E/ g6 t& `3 j7 z( N9 ~% G1 k# ]  u3 y
安装AMF
: K& d, r7 w) i+ i
$ d5 v# n' }$ h" \$ X2 ~扩展:到http://www.teslacore.it/projects/amfext/amfext-0.8.7a-bin.zip
# D/ a6 ?& n0 f) d# n; d+ k0 y* D- ~% ~/ w$ k. w5 l' J" `
下载,将php_amf.dll/ K2 U" U% k' {" x4 v& C

- P9 ?9 ~+ d( Y) P解压缩到php
$ w: J  `0 I7 d% Z+ w5 K# ^- a% M$ `5 M; l- O
根路径下的\ext
; p; ~# n3 P& X+ L
- y7 e5 b" z6 p7 Y2 x' X5 i中;打开php.ini$ \6 f0 [+ }; V5 ?5 x; `6 D. q

# @5 O" m2 ]& @  @) E* a" C,加上下面这一行:extension = php_amf.dll
8 Q- _) N1 e( _! j" \
4 A+ N7 R0 x* c。再重启php
$ Q' c- w* r; o7 F) ^& w
: i8 j# p# F. a8 g8 P5 T服务器。(如果你安装的php8 X9 o& M4 b, L/ l' _* K, i: D, K

+ P& u+ ]; \/ E7 S; r! O安装包已有,可以省略这一步)。
# B) _$ ]+ H. K4 t6 c
  n$ E* j+ S4 }: d* P8 M
0 }7 W. b' ]: K& @9 a+ d* O) z5 G! M, r+ d' Y7 m- _( y6 }, r
Flash
! [0 F1 N8 G$ ~6 v) m5 z& |' Q9 Y0 ~% |, ]' V+ g# K+ y, b. F7 G
使用NetConnection* A' o) n% c; x! `
4 r: T# C6 T2 k
类连接amfphp5 V0 {5 J# L% p9 ?/ |

# g/ d$ n) X* g6 L2 a6 {,使用call
  @6 _7 y9 |% z3 g$ V0 X7 P1 ?' k/ y' j* I
方法调用php& n2 J9 ~* k: [: S
: n" \3 G1 ~0 k) f: G
类函数。
% s: `' E* v& e9 h% B8 V8 D( q" ~, X4 A9 |6 [- C: O' ~+ b
用法:$ c; ^# S2 j/ o6 k4 [9 I3 o

; k+ z; E7 }  k" Q7 ]; M6 T1 z客户端: //定义一个nc用于连接AMFPHP private var nc:NetConnection; //定义一个responder用于处理客户端调用服务端方法的结果 private var responder:Responder; //连接路径 private var gateway:String = "http://localhost/amfphp/gateway.php"; nc = new NetConnection(); responder = new Responder(resultHandler, faultHandler); resultHandler和faultHandler分别是结果处理函数和错误处理函数。 //创建连接 nc.connect(gateway); //调用服务器方法test,RemoteConnect为ConnectTest.php所在的文件夹,传递参数"tata" nc.call("RemoteConnect.ConnectTest.test", responder,"tata"); 如果不想要responder,可以指定为null; //结果处理 private function resultHandler(_name:String):void {   trace("调用服务器方法返回结果:");   trace("Hello," + _name); }
+ Y$ \0 `' d9 Z# k1 H4 q5 N
* J; K; P+ I. w% |, |; \
- i6 k/ \+ g9 V
% [; M. R  e; V4 L8 ?' N服务端:% T- M, ?7 f+ m9 V* `

5 t+ A% w9 [5 _在amfphp
( o& a2 |7 G/ o$ _8 `* o" \
7 T5 I! a. K" R0 K, P下的service/ R% J/ V  \* y& l/ P- r

2 C% c; W% ~% N7 f目录下新建一文件夹,命名为RemoteConnect
. f3 M' m0 K+ ~# A+ I8 p9 i
* c/ j# }4 }  ?% q# I/ C9 J0 n,在此文件夹下新建一文档,命名为ConnectTest.php
- G8 O1 l9 u3 E
. y/ b. \- r1 T6 k  r。这里注意一点,提供给Flash. G5 g' _. q2 _# r3 p

+ K  g7 B+ J) n4 T5 f- S调用的类类名要与文件名相同。在ConnectTest.php
! H  V: Y3 m0 @( O! \9 H3 Y
8 S1 \( ?- I+ r输入以下代码:' n, K5 W# W6 F# y4 q* \0 c* r2 A

0 [3 [9 P, d3 b* P) k
+ d3 f2 s; b/ J# J0 v" O, M( w+ p
, z( H( G" ~' x. o6 t( i7.
" R7 P* `  `6 b" B- @6 G
+ x& H% G  t; c9 ^+ \使用Socket: S: \( d6 x- @7 f# ?5 J- P: a; s
" W: `* l7 `1 c2 d6 u
连接服务器  q1 B' p3 W, o
# n8 j1 d! h* ^! }; Z2 C
Socket
7 c+ w$ R- b- g8 s/ y2 ?1 A
3 j% o8 S& w$ D1 h! T套接字连接允许 Flash
$ x. n/ C& v. E& v0 \  p% g
# \  g# y( {9 _& m0 e3 U播放器通过指定的端口与服务器通信, socket
6 A, ~, E- c( E$ x% ^( t5 D' |. c% f, V9 E! W2 C+ A
连接与其他通信技术最大的不同是 socket
$ V/ |+ g) g6 M7 a3 O7 ^
1 \5 J" ]* |1 {8 \* y5 M0 [连接在数据传输完成后不会自动关闭。当 socket
/ ~2 {& b, ]  b* c$ M1 g
2 o8 F- H, ~, B4 g( w连接创建后,连接会一直保持,直到客户端( Flash" ?3 e4 ]& }4 k2 [/ O8 F" L, l1 I6 E

/ x( H* h% [( U2 e) B6 m播放器)和服务端主动关闭。Socket
/ F7 D) D2 G5 s/ ]0 _) {( Q. s
/ C$ [$ U* }- Q- `- H! {" f连接被普遍用于创建多用户应用程序。Socket% Y& |& v4 g4 N" ]+ ~. O4 n$ o, l
1 F" w$ B" o9 |) u2 c0 P4 \7 |! P
通信方式是异步的,也就是说你不能直接从 socket  M3 V0 h( p/ M3 E: ?

# v$ J' d5 I; D# O$ A连接中读取数据,而是通过事件处理函数进行读取处理。——摘自ActionScript3.0 CookBook4 m5 S1 J+ a# a9 m
4 v; Q6 ^: X- o6 x# v

9 c  D: D8 h: b9 ^
' G7 N3 j. E( N4 `2 }5 I5 X使用Socket.connect()# V9 y: I+ i5 W. l! G/ A4 ~( [; ]% L
" |) ]0 o9 L9 `; n+ j
方法建立连接。因为是异步通信,connect(), q) [6 V8 @9 m4 G) o$ U
! t  {+ {% F, j' Z4 u! m! q% L6 ^
方法不会等待结果而是继续执行下面的语句,因此在连接之前要注册侦听器获取连接结果。
5 m& a; y$ p* @) {; m5 W$ x& e$ `/ C1 f0 s  R4 H, z
用法: var _socket:Socket = new Socket(); _socket.addEventListerner(Event.COMNECT,connectHd); _socket.connect(连接服务器地址:string,端口号:数字); socket连接的端口号必须大于1024,如果小于则需服务器提供策略文件允许。 示例: //创建socket对象 private var _socket:Socket _socket = new Socket(); _socket.addEventListener(Event.CONNECT, onConnected); _socket.addEventListener(ProgressEvent.SOCKET_DATA, onDataHd); _socket.connect("localhost",1337); private function onConnected(e:Event):void {   //向缓冲区写入数据   var message:ByteArray = new ByteArray();   message.writeMultiByte("tata", "utf-8");   _socket.writeBytes(message);   //发送数据   _socket.flush(); }      private function onDataHd(e:ProgressEvent):void {   //接收读取数据   while (_socket.bytesAvailable)   {     trace(_socket.readMultiByte(_socket.bytesAvailable , "utf-8"));   } } (示例服务端代码来自 http://www.111cn.cn/phper/30/7cadb3c9195ac7d8ac9104da61a25c6e.htm, F3 N6 k5 @$ w2 A. J  J

* x/ l' D, b' X2 A5 ^  g7 p2 C" h( q. Q
' n4 |7 Z: p  L1 [$ o
: z5 |: [( H0 A( N, v0 `9 a  O( T8. Flash" i+ E5 w( m3 e- o% k+ S: B

3 n2 M% C/ D4 ~2 l与FMS
) X4 g" m/ Q' v. V' w8 a- U
$ T% v9 t. X7 Y, T3 M) D* [0 a交互
+ o% D& \' G0 ^* N2 ]
* S9 k9 }" k, F# m" n9 {2 pFlash Media Server' ?1 l2 i' ^/ V5 ~1 t$ q! ~* r
5 k% f* v$ e( {  `" ]
,简称FMS. `  `* F  J- p* N4 q- |
! e# H' w) w  h# T6 ~0 b
,也是一款视频、音频应用服务器。利用FMS
4 f' J( m; @3 @" I4 U
) @( F9 \) {, F' I,可以很轻松的完成视频、音频的录制、点播。也可以利用其作为聊天室的服务器……
8 A' X7 U& d) }3 j7 U, t$ i& K/ l2 u' z3 N1 D8 P% \
这里主要讲述flash* b4 F$ g7 O9 l4 ?, G

4 ~: a) _# r' |  ?4 W" @; z% {与fms
1 k! }$ V! x3 k* x6 N- L4 [8 Q3 {9 u3 i# N
之间的交互,不涉及音、视频应用。
6 e+ u$ \3 |$ W5 U- ^6 j+ w& @
' U6 g7 o% t1 }* s+ f% a
) @0 ~5 p' c9 L# T* I* S
" E( c) i9 X# }. ~! h3 E, ^环境配置:8 N, F# A* m$ C8 d

( w9 I0 o: d+ I2 n8 d% f5 h+ M下载安装Flash Media Server3.5
2 }' O5 H" _/ y# I% P& K5 g1 q+ U$ B9 ?# m

: h7 ?, z. a* s6 e
8 r8 b5 A" Y$ \$ B( V) m安装路径不能包含中文。在安装时注意记住自己设置的的用户名和密码。安装完后打开fms
- w1 B" s9 J& r% k! [& {3 f4 v* s
- E) g1 l  K" N% ?# B" {( l# K目录下的tool
/ z6 l( {- N; {. f0 i- ]1 n- ?: I& T! Y4 I+ ^. O# o0 A
文件夹,双击start.bat4 V, S  o5 m4 w! t, V7 V

$ v& J) D& ?, u) K- @: ]2 x2 O启动服务器,然后打开Administrator.swf% {# S- x# j5 P

5 I, u$ D4 Y5 Y2 x* H' u( R4 e,输入用户名和密码进入。服务端的trace
7 [- S8 @- o) x, t: B" R, w. J3 s7 W( W( Q2 n
就是在该swf9 D+ c# L# U; m: A
, W* f+ T# r  L/ n. S' o
中看的。如果改动了服务端文件,要点击右上角reload
) s8 j$ D4 ~! M, \, \9 c
$ z/ ^/ ]/ A' p) t& c& e  H% w按钮重新加载该服务。fms# D! B9 O: C2 C" r9 X- p2 U6 V

' r: k1 y1 Z* g6 I$ k* F) d7 r; ^下有个applications; c6 Z# h+ r4 q
" {& {+ K' ^! f: ^
文件夹,是用来放置服务端文件的,包括你以后录制的视频、音频,都可以在这个文件夹下找到。applications
. ^  l; k6 d$ x$ Z! x% r2 m  e% n" z  _6 c1 l
的路径也可以另外设置。
5 s; k, L+ W9 t
; d2 h9 c; D% T& A+ W, z 8 d+ [, c2 H1 T0 D

$ J; }. ~4 Q7 ~+ ^) M" AFlash
4 t/ t( i; K  E1 l  V4 u( s$ S% D! G# J# o* @$ g! u
客户端通过NetConnection# S+ a, R  t# @8 Y

% r# j: ^" n! r3 a" e6 k4 h类连接FMS0 ?+ E! T/ l. t$ @& E1 T

' O: i/ s! r2 f7 D; |9 _,可以侦听NetStatusEvent) g* t$ U7 s& S

' x, ^7 l4 _2 j$ ^5 }1 _# `的NET_STATUS/ ]0 Y/ C' q9 W0 D$ r
% v' f! s8 k: l7 F
事件来检测连接状态。用call
" f2 ~) I" c  [: p- p5 o
0 l9 H0 A5 @9 m+ \% M方法调用服务端方法,服务端返回值通过在调用call0 Y) ~" k4 m% I
. A9 s) h" l; _! ^( O' t' l
方法时指定其responder
4 }2 J2 h# G% _$ r8 t$ l* ?
6 {! b$ t+ _( l5 H8 R* M- V! m- b% J,在其resultFunction
' `+ d4 o6 H9 X7 s. W
: _) U; a2 `+ x(结果处理函数)中处理。/ {7 I+ M' W2 e7 S

, |9 @2 d( d# }5 c用法:3 O5 |6 z# B* @# a9 F  ?* i

- b) `8 b6 q' C" ]: Ovar nc:NetConnection = new NetConnection();, v$ @( {+ ^( N( f2 o( e
* K6 q' g! \" K7 c2 o% V- `
nc.call(/ P5 [9 z' T/ ~; L# a: A

9 ]' D: W9 v. y" Q% B服务端方法名:string% r- g/ R! i+ q7 P" A, J' A+ e

' q9 C$ k# m% G. N" x7 L[,结果/
8 Y* \" O8 i; Q, a& l  _
' e8 j/ T. [/ @# J: X* V错误处理:responder
2 E) i9 U# h9 b) l8 J9 F$ h) b+ o
,传递参数1
% J4 x: x$ Q/ j9 S! U- b0 K" ?% S% |" o) I2 o( ~2 Q" n! k) ?0 b
:*
$ L- d( w6 z7 ^( G! k
( V. n$ I3 }! E2 D  Y8 o3 |0 \,传递参数27 R2 M- h1 x3 e3 H  Z

/ @' S9 w/ Q) M8 ~" Q9 a:*% I  m6 D/ A: D  r1 K' P
0 s+ h& Z3 e' ?' i6 P3 k2 J
,…]);
* J* \% a- F% d5 O! r* a4 Y6 D1 e2 ?- ?: S! ^7 H2 Y  c: B: ^$ E
' P! A+ G) E3 f2 {' T# c
7 h- U7 a- S& h
服务端文件以*.asc
& o2 H% F  @6 g! a$ y( }
$ P! h* M/ K3 H1 \7 n的形式存在,命名为main! i- Q  T( y" v& t
( F6 N: {+ c  B( M! }( f
或与fms
  y) q: B; @" g9 m1 M9 m+ u& ~0 b6 b: O
% s* p) ~5 L* `* X2 ~. m实例同名,后加.asc
0 C  q! a8 k4 _% E
( Z5 V$ y, |4 ?* P9 X9 D。当一个客户端试图连接FMS
) g! U3 [8 k: d
; [! a; O" y' U0 X5 R: S0 W& K' y服务器时,会触发FMS
: p1 y" I5 n4 K6 O, ?! w8 {2 U' d1 F8 v. O
的application.onConnect
$ k1 \, p6 {5 U1 A. E5 n6 @, d
' k* j" G/ a( S- a( k6 N$ }8 [事件,FMS1 b0 c( U9 C9 n" t6 O) k7 Q

) s. M/ d& B% {9 ?# X- g& N将自动为客户端分配一个client9 s  v7 d% a+ q/ @/ ]

' M2 R, O  l2 v/ y5 g9 J' _( w5 T. N! A" S) t' u* |7 [

/ U( L. t# a! U% t, X8 I* D. kapplication.onConnect = function(client)
6 E) l0 ^- B7 z9 ^9 ~8 s+ B8 k  A  c/ f
{! h, h( N% J" {0 E1 I0 j
! k" H; R& F" x$ M
在这里设置接受或是拒绝客户端的连接,以及供客户端调用的方法。
- e& e3 B. P) t
2 m* G3 B" j% \}+ [. K, O0 Q( F$ _

& u% F# A: [3 J6 l: z' N% [FMS0 E( B, b' B; H  M
/ |4 C: b/ |* D$ V
可以通过两种方式向客户端发送信息,一是client.call( M) K7 F2 @4 {7 M: X

; y+ y3 |' k& q6 B* f; W$ y,另一是application.broadcastMsg0 L5 d4 j7 _  @& s' ^
+ W. e& ^: W+ q
。第一种方法只向特定的客户端发送消息,第二种方法称为广播,它向所有连接该FMS
% w& R4 c, l; f! R- i. D% B  U+ N- g; \. }3 K
实例的客户端发送消息,效率更高。
  z* g  _  e- K$ {5 d9 t+ |
1 u4 S4 k% D  X( ?用法:# V9 Z+ j6 ]& M/ ~

3 k6 Y( c) X/ K/ e1 c6 D& c9 J$ Jclient.call(# d. K3 q4 s8 ~0 x

7 Y  i6 g2 W" R6 B客户端方法名:string [- Z/ {# a% Q1 e% E% B2 T

% g8 _% B* g  r' o,结果处理:responder' X( o* G& M. V, k, t: r1 L
. F4 u$ _+ G& w! D$ ^
,传递参数1( N. h& o2 I% k9 A

5 L0 x- R8 }2 O% {:*6 t; d9 t/ i0 u
" _$ N! u, K6 s/ S& _
,传递参数2
. e+ ?+ W. r  |  b$ r
5 d( ]/ E, w0 U:*
' Q+ l2 b) k, U2 q( d+ F! U
1 h% v2 t7 N! e) W+ l/ w7 T- Y( D,…]);. a( h6 c# r- _

3 K- \5 N, z1 c; A7 Yapplication.broadcastMsg(2 Z5 W3 v: o. D! f9 f2 b( p* g1 @
6 B6 E9 h% g2 U& }! }( O+ P
客户端方法名:string, L- i' T+ z; R3 A/ I
' T: m& k: u- ?( {# ^# D# Z4 i
[,传递参数1
( h! t' g( [2 a. Z$ @; G
( `( |, g3 J, _& h:*- z1 p# V" R4 G; [
% J4 u! }( u  j; |
,传递参数2
2 i; f* ~0 k3 A
0 G' Q/ n6 W4 q9 C:*
8 |+ T% W& u% m  T) a
( V( y; {7 h" v3 r( ~,…]);  O2 Y: X  _9 k7 _

( c' A2 m9 `  ]! ]/ m( J示例浅析: 客户端: //定义一个nc用于连接FMS private var nc:NetConnection; //定义一个responder用于处理客户端调用服务端方法的结果 private var responder:Responder; nc = new NetConnection(); responder = new Responder(resultHandler, faultHandler); 这里resultHandler和faultHandler分别是结果处理函数和错误处理函数。 //连接FMS服务器下的fmsConnect实例 nc.connect("rtmp://localhost/fmsConnect"); //侦听连接状态 nc.addEventListener(NetStatusEvent.NET_STATUS, checkConnect); private function checkConnect(e:NetStatusEvent):void {   //e.info.code为nc的连接状态   trace(e.info.code);   if (e.info.code == "NetConnection.Connect.Success")   {     //如果连接成功,调用FMS服务端的方法fmsFunction     nc.call("fmsFunction",responder, "tata");     //指定nc的客户端为本类,FMS才能调用此客户端方法     nc.client = this;   } } //结果处理(接收参数类型根据服务端返回值的类型而定) private function resultHandler(str:String):void {   trace("返回结果:"+str); }   //错误处理   private function faultHandler(obj:*):void   {     for each (var s:String in obj)     {       trace(s)     }   }   再写一个方法,供服务端调用,此方法必须是public的   public function clientFunction(_name:String):void   {     trace("FMS回调客户端方法:");     trace("Hello "+_name);   }4 r+ e  P4 N( T, a* ]* q
3 J& L; G" [+ o4 j1 ^4 V8 z5 T( B4 L
6 E- `- ^9 }5 c- A" ^0 P
; Y1 v3 u/ j" e1 U) N1 M
服务端:
8 k9 @. B6 Y! Q' a5 J; w" E% F3 o" v5 M, k* ?
在FMS
1 n. S: A6 M( o+ \4 V1 g! k/ `8 Z. P% K: O3 k
服务器的applications, H: g+ ^% J. C/ t% I6 @7 X3 K5 q- t
8 S  K- Z2 W+ ~) p+ l
文件夹下新建一个文件夹,命名为fmsConnect0 f0 S$ z% {! J" f/ G3 p6 a2 E% C5 O

& Z! M9 q1 R0 w1 p8 I,在fmsConnect
8 L8 p6 F# D* m8 [1 H1 P8 C: Z- g' I' y
下新建一个文档,命名为main.asc; i- V& ]# O" y, @/ V; q9 a

* s" o# S, U: n8 N3 G6 B! I* _) ~& j, r
8 o) S; `/ d  l) o7 y( K
在main.asc中输入: application.onConnect = function(client) { //接受客户端的连接(要拒绝连接的话可以用application.rejectConnection(client) )     application.acceptConnection(client);         client.fmsFunction = function(_name)     {       trace("客户端调用服务器方法:");       trace("Hello," + _name);            //调用客户端函数的两种方法:       client.call("clientFunction", null, _name);       //或是application.broadcastMsg("clientFunction",_name);            //返回_name给客户端       return _name;     } }
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

软硬产品代理咨询服务:声卡:雅马哈UR22C、罗兰声卡、福克斯特、艾肯、阿波罗 、M-audio 、普瑞声纳 、福克斯特、 达思冠系列 音箱:吸顶NS-IW560C、吸顶NS-IW660 、NS-AW350、低音NS-SW050、低音NS-SW100;JBL 吸顶8124、CSS-8006BM;香蕉猴 gibbon系列;普瑞声纳E5XT、E4.5、 E3.5BT 有线话筒:舒尔PGA27、PGA48、MV51、mv88、mv88+、SM27 ;森海E945 、MK4、E835S;舒伯乐top248s;罗德NT1-A、VIDEOMIC、VIDEOMIC GO、VideoMicro、VideoMic NTG 无线领夹麦克风:罗德 wireless go II 一拖一、一拖二;猛犸lark150 耳机:森海HD300 pro、美奇 CR-Buds 、索尼7506、爱科技K240S、K240 MKII、K271 MKII、K52、K72、K92、先锋、飞利浦 1:飞利浦会务通/会议摄像头/全向麦克风/执法仪/录音笔 2:洋铭便携式移动演播室 / 切换台 / 摄控一体摄像机 / 虚拟演播室 / 微金课教室 / 色键器 3:逻兰音视频切换台 / 声卡 / 电子鼓 /电钢琴 /耳机 4:Blackmagic专业摄影机 /调色台 / 切换台/ 广播级转换器 / 监视器 / 采集卡 5:索尼专业摄像机/佳能专业摄像机/松下专业摄像机/ insta360专业摄像机 6:话筒:铁三角/ 舒尔/ 森海塞尔 / AKG / RODE/ BBS 7:音响:YAMAHA/ 声艺 / 皇冠 /JBL / 真力/咪宝/BOSE /美奇 8:声卡:RME/羚羊/IXI /艾肯/PreSonus普瑞声纳/Focusrite福克斯特/YAMAHA/雅马哈/ickb 9:耳机:铁三角/beyerdynamic拜亚动力/AKG爱科技/索尼/RunningMan/美技 10:思锐三脚架 /防潮箱 /米泊三脚架/意美捷三脚架/曼富图三脚架 11:XSW系列,300.500代理商,EWD数字系列代理,6000.9000定制产品,还包销了全国三个型号:XSW1-825,EW100 G4-945,EWD- kk 205

小黑屋|手机版|Archiver|音频应用 (鄂ICP备13005321号-1)

Powered by Audio app

快速回复 返回顶部 返回列表