實時網(wǎng)絡(luò)游戲也屬于大型應用程序范疇,一個關(guān)鍵環(huán)節(jié)就是建立實時主動通信環(huán)境,在此Socekt API就成為了首選。通過調(diào)用XMLSocket方法,F(xiàn)LASH就可以和一些由強大語言編寫的服務(wù)器應用程序進行通信,進而開發(fā)出各種實時信息交流系統(tǒng)......
本文分兩部分:FLASH編程 和 Java編程,此文記錄的僅僅是我在探索中的一些收獲,其中用了很多個人化的描述語言,并不是業(yè)界標準的用語。 :)
探索筆記:
目前國內(nèi)Flash應用大部分還是在制作精美的動畫方面,但據(jù)我了解早在Flash4 的時代,國外一些人就已經(jīng)開始將flash技術(shù)運用于開發(fā)動態(tài)網(wǎng)站(和php、asp、jsp結(jié)合)和開發(fā)應用程序(象網(wǎng)絡(luò)游戲、遠程管理等應用軟件)的項目中了。而直到今日,這方面在國內(nèi)發(fā)展還是比較緩慢(有一部分原因是少數(shù)人掌握了關(guān)鍵技術(shù),但不愿意共享出來)。因此,我將致力于推動國內(nèi)flash技術(shù)在開發(fā)動態(tài)網(wǎng)站和開發(fā)應用程序方面的發(fā)展,并將自己親手寫的代碼公布到網(wǎng)絡(luò)中,以便于大家共享、交流。
涉及到的知識范疇:
1. socket概念
2. java編程語言
3. Flash MX ActionScript中的XMLSocket
實時網(wǎng)絡(luò)游戲也屬于大型應用程序范疇,一個關(guān)鍵環(huán)節(jié)就是建立實時主動通信環(huán)境(相對的,有個稱為被動通。信的方式,最好的例子就是你正在用IE瀏覽器瀏覽一個網(wǎng)站,此時瀏覽器和服務(wù)器之間就是被動通信方式:如果你不點擊一個連接,發(fā)送一個WEB頁面請求到WEB服務(wù)器,WEB服務(wù)器是不會主動向你的瀏覽器發(fā)送任何頁面的)。在此Socekt API就成為了首選。限于篇幅,這里不再過多解釋socket的含義,只希望大家能記住一點,只要建立能夠?qū)崟r通信的應用程序就需要建立socket連接。
【客戶端FLASH編程部分】
從mx自帶的as字典中可以看出,F(xiàn)lash在網(wǎng)絡(luò)通信方面得到了非常大的加強。"The XMLSocket object is useful for client-server applications that require low latency, such as real-time chat systems"注意最后的一小段話:such as real-time chat systems(譯文:例如實時聊天系統(tǒng))
通過調(diào)用XMLSocket方法FLASH就可以和一些由強大語言編寫的服務(wù)器應用程序進行通信,進而開發(fā)出各種實時信息交流系統(tǒng)。所以我們的目標鎖定在XMLSocket!
另外值得注意的是:有很多人一看到XMLSocket前面的XML三個字母,就覺得頭疼,以為必須先熟悉甚至精通XML才能使用這個對象及其方法,但我要說的是在你不太了解XML的階段,只要把XML信息看成是一個隨意長度(>0)的字符串,把XMLSocket看成是一個只是用來發(fā)送字符串數(shù)據(jù)的對象就好辦多了。
我們還是從分析代碼著手,來跨進開發(fā)FLASH實時網(wǎng)絡(luò)游戲的大門吧:
//建立XMLSocket對象 var mySocket = new XMLSocket(); mySocket.connect("127.0.0.1",3000); //測試建立socket連接是否成功 mySocket.onConnect = function(success) { if(success) { trace("connect ok"); } else { trace("connect failed"); } } //End for 測試是否連接成功
成功建立連接后 向服務(wù)器端發(fā)送一個測試用的字符串,以便服務(wù)器端能顯示出信息。
mySocket.send("this is a testing String !!!");
FLASH中的程序就先到此,因為是基礎(chǔ)篇,所以不會涉及太多的其他東西,呵呵。
【服務(wù)器端java程序部分】
import java.io.*; import java.net.*; public class LocalServer { protected int listenPort = 3000; public void acceptConnections() { try { ServerSocket server = new ServerSocket(this.listenPort); //在服務(wù)器端,我們需要ServerSocket對象以便建立服務(wù),參數(shù)是兼聽的端口號 Socket incomingConnection = null;//創(chuàng)建一個客戶端的Socket變量,以接收從客戶端監(jiān)聽到的Socket handleConnection處理 System.out.println("Server端正在等待一個socket連接......"); incomingConnection = server.accept();//調(diào)用該 ServerSocket 的 accept()來告訴它開始偵聽 System.out.println("一個socket客戶端已經(jīng)連接過來......"); handleConnection(incomingConnection); } catch (BindException e) { System.out.println("Unable to bind to port " + listenPort); } catch (IOException e) { System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort); } } public void handleConnection(Socket incomingConnection) { System.out.println("\r\n正在對此連接進行處理......"); try {//首先獲取同Socket相關(guān)聯(lián)的流outputToSocket和InputStream //其中outputToSocket是要返回給客戶端Socket的流 //InputStream是客戶端發(fā)來的請求 otputStream outputToSocket = incomingConnection.getOutputStream(); InputStream inputFromSocket = incomingConnection.getInputStream(); BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket)); //首先要將InputStream轉(zhuǎn)換到BufferedReader中 String line = null; while ((line = streamReader.readLine()) != null) { System.out.println(line); //從streamReader中讀出信息,直接輸出到默認輸出設(shè)備中(本例中是指dos窗口) } System.out.println("\r\n\r\n接受信息完畢!"); //完成之后關(guān)閉所有流,注意關(guān)閉Socket流的順序 streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } } //主程序,建立sever實例對象,然后運行對象的acceptConnections()方法 public static void main(String[] args) { LocalServer server = new LocalServer(); server.acceptConnections(); } }
java服務(wù)端程序就到此為止了,此時已經(jīng)能夠建立起一個最簡單的C/S結(jié)構(gòu)通信體系。
在此基礎(chǔ)上再增加適當?shù)臇|西 就能夠開發(fā)出任何應用程序或者網(wǎng)絡(luò)游戲。