• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            twzheng's cppblog

            『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks
            [轉(zhuǎn)] ActionScript3.0 Socket

            介紹:Socket 連接允許Flash Player通過(guò)特定的網(wǎng)絡(luò)端口來(lái)發(fā)送和加載數(shù)據(jù)。Socket和server連接的最大的不同點(diǎn)是Socket連接在數(shù)據(jù)傳輸完畢之后是不會(huì)自動(dòng)的關(guān)閉。
                在一個(gè)socket連接建立之后,這個(gè)連接就會(huì)一直處于打開(kāi)狀態(tài),除非客戶端或者服務(wù)器段顯式的關(guān)閉它。基于此,socket允許一種特殊的數(shù)據(jù)傳輸方式,叫做data push,這種凡是允許客戶段的Flash Player沒(méi)有發(fā)送請(qǐng)求的時(shí)候,服務(wù)器可以在任何時(shí)候把數(shù)據(jù)傳送到客戶端播放器。
                Socket連接典型的應(yīng)用就是創(chuàng)建多用戶的應(yīng)用程序,一中此類應(yīng)用程序比如在線聊天室。聊天室由一個(gè)中心服務(wù)器和一些連接到服務(wù)器的Flash Player客戶端組成。每次客戶端的.swf文件發(fā)送一條消息到服務(wù)器,服務(wù)器判斷那個(gè)客戶端應(yīng)該接受這個(gè)消息,然后就把這條消息從打開(kāi)的連接上發(fā)送給合適的用戶。這種情況下,接受消息的客戶并沒(méi)有請(qǐng)求接受一個(gè)消息,但是這個(gè)消息從服務(wù)器端發(fā)送出去了。當(dāng)一個(gè)客戶關(guān)閉連接的時(shí)候,服務(wù)器通知所有的客戶有人離開(kāi)的聊天系統(tǒng)。
                Flash Player可以發(fā)送兩種socket連接到socket服務(wù)器,兩種方式有相同的行為和操作,但是也有細(xì)小的不同。第一種是XML socket連接,這種方式和之前的Player版本中的XMLSocket類似,對(duì)Flash 9來(lái)說(shuō)binary socket是全新的方式。
                我們通過(guò)flash.net.XMLSocket和flash.net.Socket兩個(gè)類來(lái)建立socket連接。
                XML socket 以文本為傳輸方式,客戶端和服務(wù)器通過(guò)包含數(shù)據(jù)的XML包來(lái)交換數(shù)據(jù),通過(guò)分析XML包的內(nèi)容來(lái)執(zhí)行動(dòng)作。
                Binary socket是ActionScript3.0的新東西,這種方式允許我們通過(guò)原始鏈接來(lái)傳遞二進(jìn)制信息。Binary socket比XML socket要更加的高效,因?yàn)閎inary socket需要了低級(jí)的類型信息,這種方式更加強(qiáng)大,因?yàn)槲覀兛梢赃B接到更加寬廣的socket服務(wù)器上。比如,binary socket允許我們連接到郵件服務(wù)器(POP3,SMTP,IMAP),新聞服務(wù)器(通過(guò)NNTP),聊天服務(wù)器,甚至是桌面共享和遠(yuǎn)程桌面通過(guò)連接VNC服務(wù)器。
                不管什么樣的socket連接類型,他們都是異步執(zhí)行的,這就意味著我們不能通過(guò)socket鏈接來(lái)獲得數(shù)據(jù)知道我們被通知數(shù)據(jù)加載結(jié)束,所有的數(shù)據(jù)加載都必須通過(guò)事件處理來(lái)自動(dòng)執(zhí)行。當(dāng)我們需要在程序運(yùn)行的時(shí)候通過(guò)加載一些數(shù)據(jù)來(lái)使它繼續(xù)運(yùn)行下去的時(shí)候就需要同步的數(shù)據(jù)加載,這種方式比較容易編寫程序,但是不夠高效。通過(guò)這章的學(xué)習(xí)你會(huì)更多學(xué)到如何通過(guò)異步的方式來(lái)加載數(shù)據(jù)。
            連接到一個(gè)Socket Server
            問(wèn)題:我們想建立一個(gè)到socket服務(wù)器的連接
            解決:Sokect.connect()或者XMLSocket.connect()方法。
            討論:在我們連接到一個(gè)服務(wù)器之前,有兩個(gè)重要的信息我們必須知道,第一個(gè)是服務(wù)器的域名或者ip地址,第二個(gè)是我們連接的端口。
                不論我們用的是那種連接方式,連接的處理過(guò)程完全一樣,兩個(gè)連接類都有一個(gè)connect方法,這個(gè)方法接受兩個(gè)參數(shù):
                Host:這個(gè)參數(shù)是一個(gè)字符串,表示我們需要連接的服務(wù)器的地址,可以是一個(gè)域名,比如www.example.com或者一段ip地址。當(dāng)我們連接的就是本服務(wù)器的時(shí)候,直接傳遞個(gè)null。
                Port:一個(gè)整形類型的參數(shù)指定了我們連接到的服務(wù)器的端口號(hào)碼。端口號(hào)碼最小必須是1024,除非有配置文件說(shuō)明端口號(hào)碼可以小于1024。 
                由于在Flash中socket編程是異步這樣的事實(shí),因此connect方法是不會(huì)等到socket調(diào)用返回就會(huì)執(zhí)行connect語(yǔ)句的下面一條語(yǔ)句的,如果你想在連接完全建立之前做一些和socket的交互工作,你的代碼就會(huì)遇到一些錯(cuò)誤。
                比較正確的做法就是在我們調(diào)用connect方法之前,我們添加一些偵聽(tīng)事件到sokect對(duì)象,當(dāng)連接成功建立的時(shí)候,會(huì)分發(fā)一個(gè)connect事件,這個(gè)事件告訴我們連接已經(jīng)建立好了,我們可以開(kāi)始和socket交互了。
                如果我們想鏈接到本地的2900端口上的代碼看起來(lái)如下:
            package {
             import flash.display.Sprite;
             import flash.events.*;
             import flash.net.Socket;
             public class SocketExample extends Sprite {
                private var socket:Socket;
                public function SocketExample( ) {
                  socket = new Socket( );
                  // Add an event listener to be notified when the connection
                  // is made
                  socket.addEventListener( Event.CONNECT, onConnect );
                  // Connect to the server
                  socket.connect( "localhost", 2900 );
                }
                private function onConnect( event:Event ):void {
                  trace( "The socket is now connected..." ); 
                }
             }
            }
                如果我們想通過(guò)XMLSocket來(lái)建立連接,基本的代碼完全一樣我們只需要用XMLSocket來(lái)代替Socket類。
                如果連接失敗,會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,或者拋出ioError或者securityErrot異常,來(lái)通知連接沒(méi)有完全成功的建立。更多的關(guān)于異常事件參考錯(cuò)誤處理章節(jié)
                記住,在我們連接到一個(gè)服務(wù)器的時(shí)候,下邊的Flash Player sandbox要遵守:
            1.       swf文件必須和主機(jī)在相同的域當(dāng)中
            2.       跨域的swf文件是不能訪問(wèn)本地服務(wù)器的
            3.       本地非信任的swf文件不能訪問(wèn)任何的網(wǎng)絡(luò)資源
            4.       如果允許跨域并且端口號(hào)低于1024的訪問(wèn)時(shí),必須配置跨域配置文件
            任何違反安全砂箱的操作比如連接到不信任域或者很小的端口的操作都會(huì)引發(fā)securityError事件,這些問(wèn)題可以通過(guò)編寫配置文件來(lái)解決。為了在Socket和XMLSocket中使用跨域的配置文件,我們必須加載配置文件:
            Security.loadPolicyFile("http://www.rightactionscript.com/crossdomain.xml");
            在我們編輯配置文件時(shí),我們不應(yīng)該僅僅指定受信任的域,還應(yīng)該有受信任的端口,如果你沒(méi)有指定任何的端口,F(xiàn)lash Player將默認(rèn)80是唯一受信任的端口,你可以通過(guò)在port屬性的值后邊添加一個(gè)逗號(hào)來(lái)制定其它的受信任的端口號(hào)碼,如下:
            <?xml version="1.0"?>
            <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
            <cross-domain-policy>
               <allow-access-from domain="*" to-ports="80,110" />
            </cross-domain-policy>
            發(fā)送數(shù)據(jù)
            問(wèn)題:我們想把數(shù)據(jù)傳送到socket服務(wù)器
            解決:對(duì)Socket對(duì)象來(lái)說(shuō),使用write方法(wirteByte(),writeUTFBytes()),來(lái)把數(shù)據(jù)寫入緩沖區(qū),然后調(diào)用flush()方法把數(shù)據(jù)刷新到輸出流。對(duì)XMLSocket對(duì)象,使用send方法。
            討論:Socket和XMLSocket定義不同的api來(lái)發(fā)送數(shù)據(jù)到服務(wù)器,讓我們先來(lái)了解下API.
                當(dāng)我們向使用Socket對(duì)象來(lái)發(fā)送數(shù)據(jù)的時(shí)候,首先必須把數(shù)據(jù)寫到緩沖區(qū),Socket類定義了一些用來(lái)寫數(shù)據(jù)的方法.每個(gè)方法都用來(lái)寫不同類型的數(shù)據(jù).這些方法有: writeBoolean( ), writeByte( ), writeBytes( ), writeDouble( ), writeFloat( ), writeInt( ), writeMultiByte( ), writeObject( ), writeShort( ), write- UnsignedInt( ), writeUTF( ), and writeUTFBytes( ).大部分這些方法接受的參數(shù)通過(guò)方法的名字已經(jīng)暗示了.
                在我們使用的時(shí)候到底使用那個(gè)方法完全取決于我們希望發(fā)送什么樣的數(shù)據(jù)到服務(wù)器,使用Socket類的時(shí)候,你可以完全通過(guò)ActionScript來(lái)把數(shù)據(jù)寫到Telent或者POP mail服務(wù)器.兩種協(xié)議都期望ASCII文本命令,比如,在我們連接到一個(gè)POP服務(wù)器之后,我們就可以通過(guò)USER命令來(lái)指定一個(gè)用戶,下邊的例子就是向Socket服務(wù)器寫這樣一個(gè)命令的例子:
            // POP servers expect a newline (\n) to execute the preceding command.
            socket.writeUTFBytes("USER exampleUsername\n");
               把數(shù)據(jù)寫入Socket對(duì)象并不意味著就已經(jīng)傳給服務(wù)器了,調(diào)用每個(gè)write方法都會(huì)把數(shù)據(jù)添加到Socket對(duì)象上,比如,下邊的例子中我們把四個(gè)字節(jié)的數(shù)據(jù)添加到Socket對(duì)象,但是他們中的任何一個(gè)都沒(méi)有被發(fā)送到服務(wù)器:
            socket.writeByte(1);
            socket.writeByte(5);
            socket.writeByte(4);
            socket.writeByte(8);
               當(dāng)我們向把Socket中的數(shù)據(jù)傳送到服務(wù)器的時(shí)候,調(diào)用Socket對(duì)象的flush()
            方法.
               XMLSocket對(duì)象基本上和Socket對(duì)象有同樣的Api接口,通過(guò)調(diào)用send()方法來(lái)把數(shù)據(jù)傳送到服務(wù)器.send方法接受任何類型的參數(shù),它會(huì)把這個(gè)參數(shù)轉(zhuǎn)換成string類型,然后傳送到服務(wù)器.一般情況下這個(gè)參數(shù)是XML對(duì)象或者一個(gè)字符串里邊包含結(jié)構(gòu)化的XML數(shù)據(jù):
            xmlSocket.send(xml);
                然而,精確的數(shù)據(jù)格式完全依賴于服務(wù)器段的期望格式,如果服務(wù)器期望格式化的XML數(shù)據(jù),那么你就必須傳遞格式化的XML數(shù)據(jù)過(guò)去,如果服務(wù)器期望URL編碼的數(shù)據(jù),那么你就必須傳遞這樣的數(shù)據(jù)過(guò)去.
            接受數(shù)據(jù)
            To be continuing……


            [源] http://tb.blog.csdn.net/TrackBack.aspx?PostId=1688278

            posted on 2007-07-19 19:31 譚文政 閱讀(814) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 技術(shù)·業(yè)界

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            亚洲伊人久久成综合人影院 | 久久99精品久久久久婷婷| 精品99久久aaa一级毛片| 26uuu久久五月天| 九九久久精品国产| 久久久久亚洲AV无码去区首| 中文精品久久久久国产网址| 国产精品99久久精品爆乳| 国内精品久久久久国产盗摄| www亚洲欲色成人久久精品| 久久se这里只有精品| 久久久精品国产亚洲成人满18免费网站| 久久精品国产精品国产精品污| 国产精品免费看久久久香蕉| 日日狠狠久久偷偷色综合96蜜桃 | 99久久超碰中文字幕伊人| 国产美女久久久| 日韩美女18网站久久精品| yy6080久久| 99999久久久久久亚洲| 国内精品伊人久久久久影院对白| 婷婷久久综合| 精品久久无码中文字幕| 国产亚州精品女人久久久久久 | 中文精品99久久国产| 嫩草伊人久久精品少妇AV| 青青草国产精品久久久久| 亚洲国产视频久久| 91精品国产综合久久精品| 日日狠狠久久偷偷色综合免费| 老色鬼久久亚洲AV综合| 99久久精品国产一区二区| 久久这里都是精品| 99久久婷婷国产一区二区| 狠狠综合久久综合88亚洲| 久久久不卡国产精品一区二区| 国内精品人妻无码久久久影院导航 | 91久久精品国产91性色也| 久久婷婷五月综合国产尤物app | 亚洲国产精品综合久久网络| 久久久久一区二区三区|