加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flash Socket 的基本通讯协议流程例子

发布时间:2020-12-15 18:48:10 所属栏目:百科 来源:网络整理
导读:? Flash Socket 的基本通讯协议流程例子 分类:?flash builder 2012-05-09 09:30 ? 13人阅读 ? 评论(0) ? 收藏 ? 举报 原文:http://www.sujun.org/article.asp?id=51 actionscript3.0 Socket通信实例文章收藏:http://as3.aa-a.net/index.php/as3-socket-co
?

Flash Socket 的基本通讯协议流程例子

分类:?flash builder ? 13人阅读? 评论(0)? 收藏? 举报

原文:http://www.sujun.org/article.asp?id=51

actionscript3.0 Socket通信实例文章收藏:http://as3.aa-a.net/index.php/as3-socket-communication-examples.html

http://blessht.iteye.com/blog/1136888

?

Flash Socket 的两种 API:

1. XMLSocket
AS2.0时采用的socket通讯类,在AS3.0时依然保留。该类只能通过发送字符串,一般发送XML格式的字符号串到服务端
2. Socket
AS3.0才拥有的对象,可以传输精确到字节(Byte),可以充分发挥网络通讯的功能了。

Flash Socket 好助手 ByteArray:

1. ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性
2. 在这里主要是利用ByteArray做数据缓存,把socket中的数据都取出来在ByteArray中存放,这样只操作ByteArray,安全

Flash 的安全策略机制:

1. 当 Flash 连接服务器需要安全策略验证时,会向服务端发送特定的字符串信息:"<policy-file-request/>"
2. 服务端在验证到这个字符串之后,马上给Flash返回策略文件。客户端收到策略文件之后会断开重新连接该服务器(假设正确的策略文件)
<cross-domain-policy>
<allow-access-from domain="*" to-ports="* "/>
</cross-domain-policy>

Socket 字节传输的协议结构:

1. 根据socket发送字节特性,可以自定义通讯协议,从而提高了协议的灵活性。
2. 最基础的协议结构:传输内容长度+ 传输具体内容(len + body)
3. 说明:这是最基本的传输格式,每次发一段数据给服务器的时候,都先声明一个长度(int,4byte),表示后面多少字节的内容是这次消息的具体内容(多少byte)

?

客户端相关代码:

socket = new Socket();
//监听socket事件
socket.addEventListener(EventCONNECT,onConnected;
socketCLOSE(IOErrorEventIO_ERRORioError(ProgressEventSOCKET_DATA(SecurityErrorEventSECURITY_ERRORsecurityError;
?
private function onConnected(evt::void
{
	userName = "soda" + Mathfloor(random) * 100000;
	//连接成功,进行发送数据
	var byteArray:ByteArray = new ByteArray//登陆消息
	byteArraywriteShort(LOGIN;
	byteArraywriteUTF(userName;
	socket(byteArraylengthwriteBytesflush}
?
function (event:{
	trace("连接socket服务器错误"}
function onClosed"socket closed":"SecurityErrorEvent"function onData://一有收到数据的事件,就通过这个函数进行检验
	parseNetData//解析对应的网路数据
function parseProtocol{
	var moveX:int = 0;
	var moveY//解析出cmd
	var cmdint = bytesreadShortswitch(cmd)
	{
		case OTHER_USERS:
			//处理玩家进入
			var user:User = new User;
			var otherName:String = bytesreadUTFvar isHero:Boolean = false;
			moveX = bytes;
			moveY = bytes;
			if(otherName == userName)
			{
				//初始化一个角色
				hero = user;
				isHero = true}
			addChild(user;
			user.setUserName(otherNamex = moveXy = moveY;
			userMap[otherName] = user"有用户进入....." + otherNamebreak;
		case MOVE//解析移动协议
			var moveName//取出对应的用户
			var moveUser:User = userMap[moveName](moveUser != null{
				moveUser;
				moveUsercase EXIT:
			var exitNamevar exitUser[exitName] = (exitUser removeChild(exitUser}
				}

?

AS3 发送指定长度指定编码的固定字符串(解决乱码问题):

var msgString = "my name is soda";
var byte = ;
bytewriteMultiByte(msg"gb2312";  //指定字符编码集
bytelength = 32(byte;
?

Socket & AMF3:

// Socket比起原来的XMLSocket来说,增加了可传递二进制数据,而AMF3则可以封装很多类型的数据 
// 发送代码; 
var bytes;   
byteswriteObject( { event:"send"message:inputtext } ;   
inputtext = ""compress;   
socket(bytes;   
?
// 接收代码; 
readBytesuncompress;   
var object:Object = bytesreadObject;

registerClassAlias() 函数的使用(序列化、反序列化相关):

当以 Action Message Format (AMF) 对一个对象进行编码时,保留该对象的类(类型)。 将对象编码为 AMF 时,该函数将保存该对象的类的别名,以便在解码对象时可以恢复该类。 如果编码上下文没有为对象的类注册别名,该对象将被编码为一个匿名对象。 同样,如果解码上下文注册了不同的别名,将为解码后的数据创建一个匿名对象。

此示例使用 registerClassAlias() 函数为 ExampleClass?注册一个别名 ( com.example.eg )。 由于为类注册了别名,因此可以将对象作为 ExampleClass 的实例反序列化,且代码将输出 true。 如果删除 registerClassAlias() 调用,则代码将输出 false。

?

package {
    import flash.display.Sprite;
    flash.netregisterClassAliasflash.utils.;
?
    public class RegisterClassAliasExample extends Sprite {
        public function RegisterClassAliasExample{
            "com.example.eg";
            var eg1:ExampleClass = new ExampleClassvar ba;
            ba(eg1position = var eg2:* = ba;
            (eg2 is ExampleClass; // true
        }
    }
?
class ExampleClass {}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读