• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks
            [轉(zhuǎn)] ActionScript3.0 Socket

            介紹:Socket 連接允許Flash Player通過特定的網(wǎng)絡(luò)端口來發(fā)送和加載數(shù)據(jù)。Socket和server連接的最大的不同點(diǎn)是Socket連接在數(shù)據(jù)傳輸完畢之后是不會(huì)自動(dòng)的關(guān)閉。
                在一個(gè)socket連接建立之后,這個(gè)連接就會(huì)一直處于打開狀態(tài),除非客戶端或者服務(wù)器段顯式的關(guān)閉它。基于此,socket允許一種特殊的數(shù)據(jù)傳輸方式,叫做data push,這種凡是允許客戶段的Flash Player沒有發(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è)消息,然后就把這條消息從打開的連接上發(fā)送給合適的用戶。這種情況下,接受消息的客戶并沒有請(qǐng)求接受一個(gè)消息,但是這個(gè)消息從服務(wù)器端發(fā)送出去了。當(dāng)一個(gè)客戶關(guān)閉連接的時(shí)候,服務(wù)器通知所有的客戶有人離開的聊天系統(tǒng)。
                Flash Player可以發(fā)送兩種socket連接到socket服務(wù)器,兩種方式有相同的行為和操作,但是也有細(xì)小的不同。第一種是XML socket連接,這種方式和之前的Player版本中的XMLSocket類似,對(duì)Flash 9來說binary socket是全新的方式。
                我們通過flash.net.XMLSocket和flash.net.Socket兩個(gè)類來建立socket連接。
                XML socket 以文本為傳輸方式,客戶端和服務(wù)器通過包含數(shù)據(jù)的XML包來交換數(shù)據(jù),通過分析XML包的內(nèi)容來執(zhí)行動(dòng)作。
                Binary socket是ActionScript3.0的新東西,這種方式允許我們通過原始鏈接來傳遞二進(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ù)器(通過NNTP),聊天服務(wù)器,甚至是桌面共享和遠(yuǎn)程桌面通過連接VNC服務(wù)器。
                不管什么樣的socket連接類型,他們都是異步執(zhí)行的,這就意味著我們不能通過socket鏈接來獲得數(shù)據(jù)知道我們被通知數(shù)據(jù)加載結(jié)束,所有的數(shù)據(jù)加載都必須通過事件處理來自動(dòng)執(zhí)行。當(dāng)我們需要在程序運(yùn)行的時(shí)候通過加載一些數(shù)據(jù)來使它繼續(xù)運(yùn)行下去的時(shí)候就需要同步的數(shù)據(jù)加載,這種方式比較容易編寫程序,但是不夠高效。通過這章的學(xué)習(xí)你會(huì)更多學(xué)到如何通過異步的方式來加載數(shù)據(jù)。
            連接到一個(gè)Socket Server
            問題:我們想建立一個(gè)到socket服務(wù)器的連接
            解決:Sokect.connect()或者XMLSocket.connect()方法。
            討論:在我們連接到一個(gè)服務(wù)器之前,有兩個(gè)重要的信息我們必須知道,第一個(gè)是服務(wù)器的域名或者ip地址,第二個(gè)是我們連接的端口。
                不論我們用的是那種連接方式,連接的處理過程完全一樣,兩個(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,除非有配置文件說明端口號(hào)碼可以小于1024。 
                由于在Flash中socket編程是異步這樣的事實(shí),因此connect方法是不會(huì)等到socket調(diào)用返回就會(huì)執(zhí)行connect語句的下面一條語句的,如果你想在連接完全建立之前做一些和socket的交互工作,你的代碼就會(huì)遇到一些錯(cuò)誤。
                比較正確的做法就是在我們調(diào)用connect方法之前,我們添加一些偵聽事件到sokect對(duì)象,當(dāng)連接成功建立的時(shí)候,會(huì)分發(fā)一個(gè)connect事件,這個(gè)事件告訴我們連接已經(jīng)建立好了,我們可以開始和socket交互了。
                如果我們想鏈接到本地的2900端口上的代碼看起來如下:
            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..." ); 
                }
             }
            }
                如果我們想通過XMLSocket來建立連接,基本的代碼完全一樣我們只需要用XMLSocket來代替Socket類。
                如果連接失敗,會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,或者拋出ioError或者securityErrot異常,來通知連接沒有完全成功的建立。更多的關(guān)于異常事件參考錯(cuò)誤處理章節(jié)
                記住,在我們連接到一個(gè)服務(wù)器的時(shí)候,下邊的Flash Player sandbox要遵守:
            1.       swf文件必須和主機(jī)在相同的域當(dāng)中
            2.       跨域的swf文件是不能訪問本地服務(wù)器的
            3.       本地非信任的swf文件不能訪問任何的網(wǎng)絡(luò)資源
            4.       如果允許跨域并且端口號(hào)低于1024的訪問時(shí),必須配置跨域配置文件
            任何違反安全砂箱的操作比如連接到不信任域或者很小的端口的操作都會(huì)引發(fā)securityError事件,這些問題可以通過編寫配置文件來解決。為了在Socket和XMLSocket中使用跨域的配置文件,我們必須加載配置文件:
            Security.loadPolicyFile("http://www.rightactionscript.com/crossdomain.xml");
            在我們編輯配置文件時(shí),我們不應(yīng)該僅僅指定受信任的域,還應(yīng)該有受信任的端口,如果你沒有指定任何的端口,F(xiàn)lash Player將默認(rèn)80是唯一受信任的端口,你可以通過在port屬性的值后邊添加一個(gè)逗號(hào)來制定其它的受信任的端口號(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ù)
            問題:我們想把數(shù)據(jù)傳送到socket服務(wù)器
            解決:對(duì)Socket對(duì)象來說,使用write方法(wirteByte(),writeUTFBytes()),來把數(shù)據(jù)寫入緩沖區(qū),然后調(diào)用flush()方法把數(shù)據(jù)刷新到輸出流。對(duì)XMLSocket對(duì)象,使用send方法。
            討論:Socket和XMLSocket定義不同的api來發(fā)送數(shù)據(jù)到服務(wù)器,讓我們先來了解下API.
                當(dāng)我們向使用Socket對(duì)象來發(fā)送數(shù)據(jù)的時(shí)候,首先必須把數(shù)據(jù)寫到緩沖區(qū),Socket類定義了一些用來寫數(shù)據(jù)的方法.每個(gè)方法都用來寫不同類型的數(shù)據(jù).這些方法有: writeBoolean( ), writeByte( ), writeBytes( ), writeDouble( ), writeFloat( ), writeInt( ), writeMultiByte( ), writeObject( ), writeShort( ), write- UnsignedInt( ), writeUTF( ), and writeUTFBytes( ).大部分這些方法接受的參數(shù)通過方法的名字已經(jīng)暗示了.
                在我們使用的時(shí)候到底使用那個(gè)方法完全取決于我們希望發(fā)送什么樣的數(shù)據(jù)到服務(wù)器,使用Socket類的時(shí)候,你可以完全通過ActionScript來把數(shù)據(jù)寫到Telent或者POP mail服務(wù)器.兩種協(xié)議都期望ASCII文本命令,比如,在我們連接到一個(gè)POP服務(wù)器之后,我們就可以通過USER命令來指定一個(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è)都沒有被發(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接口,通過調(diào)用send()方法來把數(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ù)過去,如果服務(wù)器期望URL編碼的數(shù)據(jù),那么你就必須傳遞這樣的數(shù)據(jù)過去.
            接受數(shù)據(jù)
            To be continuing……


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

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

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


            91久久香蕉国产熟女线看| 国产精品美女久久久久av爽| 一级a性色生活片久久无| 一日本道伊人久久综合影| 久久亚洲日韩看片无码| 国产成人无码久久久精品一| 国产成人久久久精品二区三区| 国产日韩久久久精品影院首页| 伊人久久国产免费观看视频| 久久综合给合久久狠狠狠97色69| 久久青草国产精品一区| 久久精品国产色蜜蜜麻豆| 色成年激情久久综合| 亚洲人成网站999久久久综合| 麻豆一区二区99久久久久| 蜜臀久久99精品久久久久久| 久久久久人妻精品一区二区三区| 国产午夜精品久久久久九九| 精品久久久久久无码专区不卡| 久久精品国产精品亚洲人人 | 久久水蜜桃亚洲av无码精品麻豆 | 无夜精品久久久久久| 九九精品99久久久香蕉| 伊色综合久久之综合久久| 一本久久久久久久| 97久久超碰成人精品网站| 欧美亚洲国产精品久久| 久久人人超碰精品CAOPOREN| 大蕉久久伊人中文字幕| 久久r热这里有精品视频| 国产午夜免费高清久久影院| 亚洲中文字幕久久精品无码APP | 色欲综合久久躁天天躁| 91久久成人免费| 日本精品久久久中文字幕| 国产精品99久久免费观看| avtt天堂网久久精品| 99久久精品国内| 久久精品成人免费网站| 国产激情久久久久影院老熟女免费| 久久精品国产久精国产|