as3 的socket 杂谈
as3 中提供2种socket,xmlsocket和socket,xmlsocket的底层是socket实现;
1。tcp服务器协议,作为一种流协议,他不停的将分片传输给客户端,P作为流,发包是不会整包到达的,而是源源不断的
到UDP服务器协议,作为数据包协议,整包到达;具体参见:http://blog.csdn.net/hili2006
2。as3 中的socket的data事件是buffer有新到的数据就触发,有时候会有2个数据发过来,而只触发了一个data事件,所以as3中的socket是需要解码的,解码参见:http://blog.csdn.net/hili2006/archive/2010/04/20/5508715.aspx
测试代码如下:php tcp server&as3 socket
php:
$msg1 = "Welcome To ICA Server: 1 ";
$msg2 = "Welcome To ICA Server: 2 ";
$msg3 = "Welcome To ICA Server: 3 ";
@socket_write($msgsock, $msg1, strlen($msg1));
sleep(5);
@socket_write($msgsock, $msg2, strlen($msg2));
as3:
var counter2=0;
function data_handler(e:Event){ //如果php有sleep,那会接到2个data事件,并且byteavailable,如果
counter2++; //没有sleep,则触发一个data事件,数据一起呈现到byeteavailable中
trace (counter2+"\n");
trace (e.target.bytesAvailable+"\n");
}
3。as3 的socket和xmlsocket类似,接到的数据中含有结尾符“\0”,在read数据的时候会当成结尾,结束读取返回,即使read中设定了length长度参数,并且当成读取了所有buffer数据处理,即bytesAvailable==0;
测试代码如下:
php:
$msg1 = "Welcome To ICA Server: 1 ";
$msg2 = "Welcome To ICA Server: 2 /0";
$msg3 = "Welcome To ICA Server: 3 ";
@socket_write($msgsock, $msg1, strlen($msg1));
@socket_write($msgsock, $msg2, strlen($msg2));
@socket_write($msgsock, $msg3, strlen($msg3));
as3:
function data_handler(e:Event){
trace (e.target.bytesAvailable+"\n"); //=152
trace ("receiving data: "+e.target.readUTFBytes(e.target.bytesAvailable));// 只有输出Welcome To ICA Server: 1
trace (e.target.bytesAvailable+"\n");//=0
}
4。如果as3 的data事件函数正在执行的时候,比如在此函数中用while循环解码,此时有新的数据发送过来,data事件还会触发么?触发的话,正在执行的怎么办?原有数据还有么?