本文是本人學習flash網路應用的過程,源碼、說明陸續推出;
先做一下自我介紹,為想學的朋友好上手;
Flash 2004 MX學習了45天,包含AS文法在內;
Flash Communication學習了10天;
Flash Remoting看了一點點資料,沒學;
C#學習文法10天;Bc,十五年前看過5天資料,沒學成,呵;C和Vc和Bc一樣十五年前看過資料,學不下去;VB十五年前看過一陣子資料,寫過幾個非常簡單的程式,現在忘得一乾二淨;ASP學習加應用共十年左右,應該說相當熟悉;SQL也還行,資料庫總不能說不會吧,呵;JavaScript呢還行,強強牛牛的東西做不來,正常東西都可寫;其它一些做圖軟體都會用,不能說會做圖;
電腦硬體非常熟,以前做這行的,呵好像和這個關係不大,其實有點關係,因為對作業系統和硬體搭配後的效能心裡有底,對自已要開發面向的使用者群使用的機器做一個分析,這樣自已開發出來的flash運算強度和美工強度,flash多大都有很直接的關係,因為機器好的人都去玩3D了;
舉例說一下:
Flash做遊戲,面向使用者是一般機器的,這此人的機器不會是非常好,所以他們所能玩的遊戲畫面都一般,因為好的畫面,他們的機器跑不動,顯示器大小,現在基本是15、17,機器一般顯示器就不會太好,所以上1024應該有困難,再說上了後,如果flash按1024做機器運行就很吃力,所以我們按800*600做。
引言
因為一直寫的是asp,重來沒有寫過傳統型應用程式,所以寫傳統型程式一直是我的夢想。開發遊戲更不用說,因為學電腦的原因就是因為玩遊戲,玩得多了就覺得沒意思,就想開發給別人玩,後來發現自已一個人是做不來的,所以就放棄了,這樣就走進了編程這個行當(十幾年前的事,呵,想想還算好,起碼選對了,現在就靠這個吃飯呀)。因為有點點VB知識,所以學ASP很快,就一直寫這個,寫了十多年。
開發娛樂項目對小團體和個人開發來說是難度最大的,因為涉及方面多廣,所以想學編程最好選這個來上手,學習東西必須要能提起你的興趣才會堅持下去,開發娛樂項目是我的興趣,因為也涉及方面多廣,所以寫完,基本就搞定這門語言了。
原由:
前面說過我的夢想,但一直沒有做過,萬事需要一個起因,公司的外部網站有一個flash,因為公司變動需要改,原改過一次,因為不懂,所以一改就需要找別人,我是最討厭去求人的,這次又要變,所以就馬上學flash,本來flash就不難,所以一下就搞定了。
改完後發現flash的語言和JavaScript很像,網上flash遊戲很多,興趣來了,公司年終有晚會,需要一個抽獎程式,用別的語言寫有點麻煩,因為畫面效果問題,用flash是最簡答的,所以借這個學習flash文法,寫完這個,加做美工45天,搞定flash了。
接著我對flash的興趣就很大了,想做遊戲,我知道flash可以和asp通訊,但效果不好,在網上查資料,發現了:
Flash Communication
Flash Remoting
這兩個東西,是做flash網路應用的,好做網遊有希望了。我在flash8發過貼,問Flash Communication、Flash Remoting做用,但這裡好像做flash網路應用的人不多,沒有得到答案,繼續找,終於得到答案:
Flash Communication是做視頻會議、聊天等東西的、Flash Remoting是做與資料庫通訊與存取的,知道要做什麼用後,可以開始了。
Flash Communication網上資料少得可憐,把網上搜便後,還用錢買了一本電子書《Flash Communication Server MX 1.5 參考大全》,可以開始著手寫了。
定位為回合遊戲,如象棋、麻將這些,如QQgame;10天把架構搭好了,遊戲大廳完成,但發現一個很大的問題:
SharedObject用起來怎麼都不爽;
SharedObject說明:flash的一種存取資料庫,可以存取比較簡單的資料,Flash Communication就是與本地SharedObject進行通訊來完成網路應用。SharedObject文法很麻煩,再加上Flash Communication本身不成熟,老是有一些莫名奇妙的問題,可能一個是我對Flash Communication的原理瞭解得太少,所以碰到很多問題。
為了自已的夢想,堅持著把與Flash Communication的通訊部分寫完,登陸大廳都正常了,再望向就要與資料庫通訊了,資料庫我定在SQL,Flash Communication本身不能操作資料庫,所以有了Flash Remoting這麼一個東西;
天呀,又得學Flash Remoting,這個網路的資料也是少得可憐,看資料說是和JAVA很像,可是我對JAVA是一點不懂,學JAVA太誇張了吧,所以開發開始挺住了。
為了自已的夢想實現,所以有空就上網看東西,原來在帝國BBS看到過自已寫與FLASH通訊的伺服器端文章,但我只會寫ASP,別的不會,所以一直不太理會,後來經過考慮,如果要學Flash Remoting的語言,不如學。NET,因為一直沒有時間學,二個是懶不想學,好,那麼定位為C#,這個現在比較火,學的人多,十多年前一直想學C沒有學成,現在終於可以逼迫自已去學了,因為找到理由了。
本文為原創,其實我現在還在學習C#中,所以一邊學一邊寫這個東西。
下面是我與Flash Communication通訊的一段代碼,我個人感覺太麻煩,所以一直寫都不爽SharedObject,我的AS語言剛學沒有多久,可能下面的代碼看起來比較醜,反正不用Flash Communication了,所以大家可以將就的看一下,不過如果要做視頻會議等東西,還需要用到Flash Communication,所以學東西不會白學,以後用得到,呵。
//是否點GAME案頭
//table案頭
//channel頻道
no_play = 0;
no_one = 0;
//桌的台號
var table_no;
//案頭左右
var table_place;
function run_program(str, str2, str3) {
var game_so = SharedObject.getRemote("game_room", client_nc.uri, true);
game_so.connect(client_nc);
game_so.onSync = function() {
//<2>
//for (a in game_so.data) {
// trace(a+": "+game_so.data[a]);
//}
//讀GAME案頭
for (i=1; i<=4; i++) {
dot_program(i);
}
//判斷是否點GAME案頭
if (no_play == 1) {
write_data(str, str2, str3);
no_play = 0;
}
};
//<2>
//=========================================================
function dot_program(str) {
//判斷GAME案頭資料
//if (eval("game_so.data.play_name"+str) != null) {
eval("_root.room_table.table_room.p"+str+"_u1").text = eval("game_so.data.play_room"+str+".play_name1");
eval("_root.room_table.table_room.p"+str+"_u2").text = eval("game_so.data.play_room"+str+".play_name2");
trace(eval("game_so.data.play_room"+str+".play_name1"));
//} else {
//eval("play_user"+str).text = "";
//}
}
//=========================================================
function write_data(str, str2, str3) {
//寫空離開遊戲
table_no = str;
table_place = str2;
if (eval("game_so.data.play_room"+str+".play_name"+str2) != "") {
if (eval("game_so.data.play_room"+str+".play_name"+str2) == myname) {
for (a in game_so.data) {
if (a == "play_room"+str) {
if (str2 == 1) {
game_so.data[a].play_name1 = "";
} else {
game_so.data[a].play_name2 = "";
}
break;
}
}
}
goto_list();
} else {
//寫開始遊戲
//eval("game_so.data.play_room"+str+".play_name2");
if ((eval("game_so.data.play_room"+str+".play_name1") != myname) && (eval("game_so.data.play_room"+str+".play_name2") != myname)) {
for (a in game_so.data) {
if (a == "play_room"+str) {
if (str2 == 1) {
game_so.data[a].play_name1 = myname;
} else {
game_so.data[a].play_name2 = myname;
}
break;
}
}
play();
}
}
}
}
//run_program();
setInterval(run_program, 2000);接著:
我在帝國BBS看到二篇文章《flash多人網路遊戲的實現的討論》和《視頻教程:用FLASH2004和VB建立聊天室》,剩了我不少力氣,在此多謝一聲。
flash
多人網路遊戲的實現的討論,原始碼陸續公開
http://flashempire.net/showthread.php?t=182045
想看看flash究竟能夠承受多大的網路資料轉送,
=======================================
我在flash登陸到伺服器以後,
每隔3毫秒就發送100次100個字元的串 "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" 給flash,
然後在flash裡面接收資料的函數裡面統計資料,
var g_nTotalRecvByte = 0;
var g_time = new Date();
var g_nStartTime = g_time.getTime();
var g_nCounter = 0;
mySocket.onData=function(xmlDoc)
{
g_nTotalRecvByte += xmlDoc.length;
// 每接收超過1k位元組的資料,輸出一次資訊,
if( g_nTotalRecvByte-g_nCounter > 1024 )
{
g_time = new Date();
var nPassedTime = g_time.getTime()-g_nStartTime;
trace( "花費時間:"+nPassedTime+"毫秒" );
g_nCounter = g_nTotalRecvByte;
trace( "接收總數:"+g_nTotalRecvByte+"位元組" );
trace( "接收速率:"+g_nTotalRecvByte*1000/nPassedTime+"位元組/秒" );
}結果十分令我意外,
這是截取的一段調試資訊,
//
花費時間:6953毫秒
接收總數:343212位元組
接收速率:49361.7143678988位元組/秒
花費時間:7109毫秒
接收總數:344323位元組
接收速率:48434.800956534位元組/秒
花費時間:7109毫秒
接收總數:345434位元組
接收速率:48591.0817273878位元組/秒
。。。
。。。
。。。
。。。
花費時間:8125毫秒
接收總數:400984位元組
接收速率:49351.8769230769位元組/秒
花費時間:8125毫秒
接收總數:402095位元組
接收速率:49488.6153846154位元組/秒
花費時間:8125毫秒
接收總數:403206位元組
接收速率:49625.3538461538位元組/秒
我檢查了幾遍來源程式,沒有發現邏輯錯誤,
如果程式沒有問題的話,
那麼我們得出的結論是,flash的xml socket每秒可以接收至少40K的資料,
這還沒有計算xmlSocket.onData事件的觸發,調試代碼、資訊輸出佔用的時間。
比我想象中快了一個數量級,
夠用了
視頻教程:用FLASH2004和VB建立聊天室(1――7)
http://www.flashempire.com/school/tutorview.php?id=375
建議先看一下這兩篇文章,很有協助。
先確定要實用的幾樣東西:
Flash通訊方面:XMLSocket
這個比較簡單,操作也很方便,至少資料格式很明了,我操作起來方便。
註:需要注意的東西有二個,這個在伺服器端編寫時是要注意的,不然會把你搞得一頭水,今天就浪費了我大半天,本來就知道,可是就是沒有留意。
1. 資料格式flash端發送時會自動在代碼後加一個零位元組資料,這個很重要,不然就搞死人,這個是看不到的,不管在接收還是發送時都要注意。
伺服器收到flash發來的資料後先將最後一個字元切掉,然後再進行你想要的運算,返回給flash時記得加上一個如“\0”,這樣就可以了,這樣就表示一個零位元組資料,不然flash是收不到的,同時記得,伺服器一收到資料就先切掉這個零位元組資料,不要到與你運算的地方再切,和一個切一個,我最初也是這樣,其實是個人懶,給自已找麻煩,flash是不管你這麼多的,他只認零位元組資料,但偏偏零位元組資料在正常顯示是沒有問題的,也不換行不空格,所以跟本注意不到。
一個例子我要發送的資料是:
string aaa=” 使用者名稱\0”;
string bbb=” 登陸了”;
string ccc=aaa+bbb+”\0”;
Socket.send(ccc);大家看到了吧,使用者名稱如多出一個\0,如果是flash收到時就會是把他認為兩條資料,他就分別按兩條資料來收,所以一定要記得這個零位元組資料。
2. 伺服器端收到的資料是一種資料流,必須將他轉換為flash一樣的格式,不然中文中會是亂碼,在此也要注意一個地方,flash預設是utf8編碼,伺服器端收到轉為utf8就行了,不過在寫flash是,很多地方的文章都可以看到希望大家加上一句System.useCodepage = true;這句把我給害死了,這句我不知道到底有什麼做用,因為很多人說如果不加與asp、php動態交換資料時收到資料會是亂碼,我試過很多次都沒有這種情況,為了保險,所以我加上了,結果害了我,加了這句到了伺服器編碼就變了,我怎麼轉都轉不到utf8,後來刪了這句就正常了,暈死。。。
伺服器方面的C#需要用到:
using System.Net.Sockets; 這個就是winsocket,與flash通訊就靠他了。
using System.Text; 編碼轉換。
using System.Collections; 雜湊表。
using System.Threading; 多線程。
這是我目前用到的,C#我也剛學十多天,目前通訊的是完成了,等我把大廳完成,再著寫後面,因為是自學,理論我說不清,反正寫出能用,呵呵。