ActionScript接收socket服务器发送来的数据

原文地址:http://www.asp119.com/news/2009522181815_1.htm

从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可以接收数据,但是两者实现方法有些不同,让我们先看看Socket类是如何做的。

正如前面所讲到的,Flash提供的socket通信方式是异步通信,也就是说仅仅创建socket连接并试图读取数据这是不可能的,read方法读取数据时并不会等待数据传输过来而立即返回,如果数据还没准备好而去读取数据会导致异常。

当数据准备好了时,socketData事件就会触发,通过注册该事件处理函数,当数据发送过来时就会触发,因此可通过该处理函数读取数据。

为了读取服务器发送来的数据,Socket类提供了一系列read方法来读取不同类型的数据,例如通过readByte( )方法读取一个字节,readUnsignedInt( )方法读取一个无符号整数,具体看下面的表格:

Table 24-1. Socket read methods for various datatypes

方法:返回类型描述字节数readBoolean():Boolean读取布尔型数据1readByte():int 读取一个字节数据1readDouble():Number读取IEEE 754 双精度浮点数 8readFloat():Number读取IEEE 754单精度浮点数 4readInt():in 读取32位整数 4readObject():* 读取AMF格式对象NreadShort():int 读取16位整数 2readUnsignedByte():uint读取无符号字节1readUnsignedInt():uint 读取无符号32位整数4readUnsignedShort():uint读取无符号16位整数 2readUTF():String读取UTF-8字符串n

还有两个方法没有在上面的表格里,它们是readBytes( )和readUTFBytes( ),readBytes( )方法没有返回值,它接受三个参数:

bytes

一个flash.util.ByteArray 实例填充读取的数据

offset

一个uint值指定读取数据的偏移量,默认为0

length

一个uint值表示读取的字节数,默认为0,表示所有的数据

readUTFBytes( )方法只接受一个参数,表示读取的UTF-8字节数,返回一个字符串。

下面的例子代码连接一个socket服务器并读取和显示服务器发送的数据:

package {

import flash.display.Sprite;

import flash.events.ProgressEvent;

import flash.net.Socket;

public class SocketExample extends Sprite {

private var socket:Socket;

public function SocketExample( ) {

socket = new Socket( );

// Listen for when data is received from the socket server

socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );

// Connect to the server

socket.connect( "localhost", 2900 );

}

private function onSocketData( event:ProgressEvent ):void {

trace( "Socket received " + socket.bytesAvailable + " byte(s) of data:" );

// Loop over all of the received data, and only read a byte if there

// is one available

while ( socket.bytesAvailable ) {

// Read a byte from the socket and display it

var data:int = socket.readByte( );

trace( data );

}

}

}

}

上面的例子中,如果socket服务器发送"Hello"字符串,则输出:

//Socket接收5字节的数据:

72

101

108

108

111

Socket对象接收的数据都是ASCII编码的文本,我们可以用readUTFBytes( )方法重新构造字符串,readUTFBytes( )方法需要知道有多少个字节需要转换,用bytesAvailable属性指定字节数:

var string:String = socket.readUTFBytes(socket.bytesAvailable);

XMLSocket类和Socket类基本类似,两者都要注册jian听器检测数据是否接收完毕,但是两者读取数据的方式是不同的。

当数据准备好时XMLSocket实例发出data事件,事件类型为flash.events.DataEvent.DATA ,它其中的data属性包含接收过来的数据。

从服务器返回的数据都是原始的数据,如果你希望以XML进行处理则需先把数据转换为XML 实例。

下面的代码例子用XMLSocket连接本地服务器,端口为2900,连接成功后,发送<test>消息给服务器,onData事件处理函数处理服务器返回的数据,返回数据为<response><test success=‘true‘/></response>,注意到该事件的data属性的内容只是字符串数据,需用XML构造器转换位XML实例,最后通过E4X 语法输出XML:

package {

import flash.display.Sprite;

import flash.events.Event;

import flash.events.DataEvent;

import flash.net.XMLSocket;

public class SocketExample extends Sprite {

private var xmlSocket:XMLSocket;

public function SocketExample( ) {

xmlSocket = new XMLSocket( );

// Connect listener to send a message to the server

// after we make a successful connection

xmlSocket.addEventListener( Event.CONNECT, onConnect );

// Listen for when data is received from the socket server

xmlSocket.addEventListener( DataEvent.DATA, onData );

// Connect to the server

xmlSocket.connect( "localhost", 2900 );

}

private function onConnect( event:Event ):void {

xmlSocket.send( "<test/>" );

}

private function onData( event:DataEvent ):void {

// The raw string returned from the server.

// It might look something like this:

// <response><test success=‘true‘/></response>

trace( event.data );

// Convert the string into XML

var response:XML = new XML( event.data );

// Using E4X, access the success attribute of the "test"

// element node in the response.

// Output: true

trace( [email protected] );

}

}

}

收藏于 2011-05-24

来自于百度空间

时间: 2024-10-13 11:58:14

ActionScript接收socket服务器发送来的数据的相关文章

使用post()方法以POST方式从服务器发送数据

使用post()方法以POST方式从服务器发送数据 与get()方法相比,post()方法多用于以POST方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面,调用格式如下: $.post(url,[data],[callback]) 参数url为服务器请求地址,可选项data为向服务器请求时发送的数据,可选项callback参数为请求成功后执行的回调函数. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti

浏览器向服务器发送请求报文

参考资料:浏览器加载和渲染html的顺序 域名:就是给IP起了一个别名,域名的作用就是方便人的记忆 1>浏览器向服务器发送请求报文 http:/www/baidu.com:80/login.aspx 当我在浏览器中输入一个这样以一个url地址:浏览器第一步做的事情就是根据这个www/baidu.com的域名来找DNS服务器,解析成对应的IP地址. 例如解析成:http://202.108.22.5 :80/login.aspx 浏览器在解析到IP地址后,做的第二步就是对指定的URL进行HTTP封

java的nio之:java的bio流下实现的socket服务器

第一:socket服务器的启动 1 package com.yeepay.sxf.testbio; 2 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 /** 8 * 时间服务器 9 * 基于同步阻塞I/O实现的服务器模型 10 * @author sxf 11 * 12 */ 13 public class TimerServer { 14 15 /** 16

Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包

先说明一下粘包的概念: 发送时是两个单独的包.两次发送,但接收时两个包连在一起被一次接收到.在以前 WinCE 下 Socket 编程,确实也要处理粘包的问题,没想到在 Android 下也遇到了.首先想从发送端能否避免这样的问题,例如: (1) 调用强制刷数据完成发送的函数:(2) 设置发送超时.1 先试了调用 flush() 函数,但运行后现象依旧2 设置发送超时是 Windows 平台的做法,但在 Android 平台下是否有类似的设置呢?查看 Socket 类的实现代码:java.net

一个客户端向服务器发送数据,服务器向连接的客户端转发数据demo

服务端代码: // 负责处理每个线程通信的线程类 public class ServerThread implements Runnable { // 定义当前线程所处理的Socket Socket s = null; // 该线程所处理的Socket所对应的输入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException { this.s = s; // 初始化该Socket对应的输入流 br = ne

HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送).基于数据推送是这样的,当数据源有新数据,它马上发送到客户端,不需要等待客户端请求.这些新数据可能是最新闻,最新股票行情,来自朋友的聊天信息,天气预报等. 数据拉与推的功能是一样的,用户拿到新数据.但数据推送有一些优势. 你可能听说过Comet, Ajax推送, 反向Ajax, HTTP流,W

C语言 Socket入门示例2——模拟远程CMD(客户端向服务器发送命令,服务端执行该命令)

只要把上一篇文章"C语言 Socket入门示例1"中的两段程序彻底搞懂,那么再看本文就没有任何难度了,因为仅仅是对上篇文章中服务端代码的简单修改扩充.但是简单修改过后,功能变得异常强大,犹如一个远程CMD.随着不断深入学习,功能将会变得越来越强大.欢迎大家评论指点. 1.服务端(Server): #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")

C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)

如果对Windows API不太熟悉.对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的.以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解.学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻.更遗憾的是,以前学C的时候,误以为自己把C学会了,误以为C就那么几个头文件而已,就一个黑框子而已. 现在,经过一段时间的痛苦磨练,又有了一些新的认

[C#参考]利用Socket连续发送数据

这个例子只是一个简单的连续发送数据,接收数据的DEMO.因为最近做一个项目,要求robot连续的通过Socket传回自己的当前的位置坐标,然后客户端接收到坐标信息,在本地绘制地图,实时显示robot的位置. 里面还有好多的问题,在实际的项目中一定要解决,不然肯定跑步起来.比如:消息边界问题(帧的边界).消息命令的解析等 下面直接代码: 服务器的代码: using System; using System.Collections.Generic; using System.Linq; using