本文是本人学习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个字符的串 "01234567890123456789012345678901234567890123456789012345678901
23456789012345678901234567890123456789" 给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#我也刚学十多天,目前通讯的是完成了,等我把大厅完成,再着写后面,因为是自学,理论我说不清,反正写出能用,呵呵。