从Socket服务器读数据
2009年09月23日
解决方法:
对于Socket实例,先收到socketData事件,然后调用如下两个方法的一个,比如,readByte()或者readInt(),在事件控制器中确定不会去读过去的bytesAvailable.
对于XMLSocket实例,先收到data事件,然后解析从事件控制器内部装载的XML数据.讨论:
从一个socket连接接收的数据依赖于你使用的Socket的类型.socket和XMLSocket都可以从服务器接受到数据,但是它们处于不同重量级的技术.让我们在讨论XMLSocket之前先关注下Socket类.
我都知道socket在Flash中是一个异步的行为.因此,它就不能简单的创建一个Socket连接,然后就立刻尝试去读取数据.read方法不能等到 从服务器传过来数据之后在返回.换句话说,你只能在客户端从服务器载入所有数据之后才可以读取数据.在数据可用之前读数据会产生一个错误.
通过socketData事件广播到Socket实例,这样我们就可以知道什么时候数据可以被读取.那么我们要为socketData事件添加一个事件监 听器,任何时候只要有新的数据从一个socket服务器发送过来,都会触发事件控制器.在事件处理器的内部我们写入我们要执行的代码去读取和处理收到的数 据.
从一个前端服务器读取数据,Socket类为我们提供了许多不同的方法,这些方法依赖于你所读得数据类型.例如,你可以通过readByte()方法读一 个byte数据,或者通过一个使用readUnsignedInt()方法去读一个无符号整数.下面这个表列出来能够从服务器读取的数据类型,返回值,和 read方法每次读入的字节数.Table:Socket read methods for various datatypes 方法:返回值类型 描述 字节数
readBoolean( ):Boolean 从Socket读取一个Boolean值. 1
readByte( ):int 从Socket读取一个byte值. 1
readDouble( ):Number 从Socket读取一个IEEE 754双精度浮点数. 8
readFloat( ):Number 从Socket读取一个IEEE 754单精度浮点数. 4
readInt( ):int 从Socket读取一个有符号32-bit整数值. 4
readObject( ):* 从Socket读取一个AMF-encoded对象. n
readShort( ):int 从Socket读取一个有符号16-bit整数值. 2
readUnsignedByte( ):uint 从Socket读取一个无符号字节. 1
readUnsignedInt( ):uint 从Socket读取一个无符号32-bit整数 4
readUnsignedShort( ):uint 从Socket读取一个无符号16-bit整数. 2
readUTF( ):String 从Socket读取一个一个UTF8字符串. n
有两个额外的方法没有在上面这个表中描述.它们分别是readBytes()和readUTFBytes().readBytes()方法只可以让socket读数据但不能返回一个值,并且该方法需要3个参数:bytes:
一个flash.util.ByteArray实例读取从socket中收到的数据.
offset:
一个uint值,指定从什么位置开始读取socket中收到数据的偏移量.默认值为0.
length:
一个uint值,用于指定读取bytes的数量.默认值为0,意思就是说将所有的可用的数据都放入ByteArray中. 另一个readUTFBytes()方法,只需要一个长度参数用于指定UTF-8字节的读入数量,并且该方法会将所有读入的字节码转换成为字符串类型.
注意:在从一个Socket读数据之前,首先要判断bytesAvailable的属性.如果你不知道要读入的数据类型是什么就去读数据的话,将会产生一个错误(flash.errors.EOFError).
下面的例子代码连接了一个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 received 5 byte(s) of data:
72
101
108
108
111注意:一旦数据从socket读出,它就不能再次被读.例如,读一个字节之后,这个字节就不能再"放回来",只能读后边的字节.
当收到的数据为ASCII编码,你可以通过readUTFBytes()方法重新构建一个字符串.readUTFBytes()方法需要知道多少个字节需要转换为字符串.你可以使用bytesAvailable去读所有的字节数据:
var string:String = socket.readUTFBytes(socket.bytesAvailable);
XMLSocket类的动作和Socket类相比在从服务器接受数据的风格相似.两者都是通过事件监听器来监听数据接收通知的,这主要取决于Flash异步的Socket实现.然而,在处理实际数据的时候有很大的不同.
有个XMLSocket实例在从服务器下载完数据后分发数据事件.通过flash.events.DataEvent.DATA常量定义的数据事件包含一个data属性,该属性包含了从服务器收到的信息.
注意:使用XMLSocket从服务器返回的数据总是认为是一个字符串类型的数据.这样不用为任何数据类型的数据指定读取方法.
这些从服务器返回的数据是没有经过任何处理的原始数据.因此,你不能通过XMLSocket连接立即使用XML,你发送和接收的都是纯字符串数据.如果你期望XML,在你处理数据之前,你必须首先将这些数据转换为一个XML的实例.
下面的这段代码在初始化的时候通过XMLSocket连接到了本地服务器的2900端口.在连接成功之后,一个消息会发送到服务 器.onData事件监听者控制从服务器返回的响应.在本例中返回字符串.你可以通过事件的data属性发现为字符串数据,然后XML类的构造函数将 字符串转换成为了XML实例.最后,通过使用E4X语法的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( "" );
} private function onData( event:DataEvent ):void {
// The raw string returned from the server.
// It might look something like this:
//
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( response.test.@success );
}
}
}注意:在data事件分发数据之前,XMLSocket实例必须从服务器收到一个表示为空的byte('""0').也就是说,从服务器仅仅只发送所需要的字符串是不够的,必须在结尾处加入一个表示为空的byte.
发表评论
-
[转载](据说上期命中率80%)2011年9月证券从业资格考
2012-01-20 12:10 464[转载](据说上期命中率8 ... -
[转载]2011年普通高等等学校招生全国统一考试英语试卷
2012-01-20 12:10 599[转载]2011年普通高等等学校招生全国统一考试英语试卷 2 ... -
韶关市田家炳中学2011-2012学年第一学期期末考试高二语文试题与参考答案
2012-01-20 12:10 601韶关市田家炳中学2011-2012学年第一学期期末考试高二语文 ... -
东方犹太人
2012-01-19 16:56 544东方犹太人 2010年10月07日 潮商是中国传统的 ... -
游客屈指可数的人间天堂――四千美岛
2012-01-19 16:56 737游客屈指可数的人间天 ... -
情迷芝加哥三
2012-01-19 16:56 531情迷芝加哥三 2011年08 ... -
梅州人创办、控股的品牌、集团或名企业及相关人物 [转]
2012-01-19 16:56 549梅州人创办、控股的品牌、集团或名企业及相关人物 [转] 20 ... -
<潮汕家名人荟萃>Ⅱ
2012-01-19 16:55 707Ⅱ 2011年06月21日 马介璋:潮南成田人,佳宁娜 ... -
2012.1.10
2012-01-17 06:41 3822012.1.10 2011年12月28日 10锛 -
SOCKET模型之重叠I/O 2009-9-26 晴
2012-01-16 05:21 671SOCKET模型之重叠I/O 2009-9-26 晴 200 ... -
原始套接字透析之Raw Socket基础(转自www.cctry.com管理员)
2012-01-16 05:21 718原始套接字透析之Raw Socket基础(转自www.cctr ... -
总结java socket编程
2012-01-16 05:21 489总结java socket编程 2011 ... -
使用Socket API(下)
2012-01-16 05:21 364使用Socket API(下) 2009年11月30日 ...
相关推荐
Android Socket编程实现服务器数据读取
Socket客户端通过Socket服务器读取mysql数据库中的一条记录。
android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信
3.从Socket服务器读数据. 4.同Socket服务器进行握手,并确定收到了什么样的数据和如何处理这些数据. 5.与Socket服务器断开,或者当服务器想与你断开的时候发消息给你. 6.处理使用Sockets时候引发的错误.
为了防止一直收数据,浪费电池的电,采用NIO的方式读socket的数据,这个是本文的关键 (3)开启一个线程,做心跳,防止socket连接终断 , SocketHeartThread (4)构建 SocketThreadManager对以上三个thread进行...
本文实例讲述了PHP向socket服务器收发数据的方法。分享给大家供大家参考。具体如下: 在PHP要向其它程序发送数据,则需要使用到php的socket功能来实例了,下面我们简单看一个实例,代码如下: 复制代码 代码如下:/*...
socket协议数据传输,客户端发起请求每个五秒检测服务端是否在线。同时客户端读、写线程接收和发送数据;如果对方服务器挂掉,客户端数据收取超时会自动断开连接,当服务端重新上线,客户端会重启连接,继续发送请求...
服务器或客户端: 使用 read() 对对方 Socket 进行数据读取。 UDP 情况下使用 sendto() 发送数据。 UDP 情况下使用 recvfrom() 接收数据。 关闭阶段 服务器或客户端: 使用 close() 关闭套接字 服务器或客户端: 使用 ...
linux 下的 Socket 服务器同时与多个客户端进行文件传输, 其中客户端用 Qt 编写的, 可以在Ubuntu 和 Windows 下运行。服务器代码可以在 ubuntu 下运行, 也可以用交叉编译器编译在 ARM 下运行。命令与数据端口分开...
Qt下UDPSocket一段时间后接收不到数据的问题
C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一)
服务器端部分,这是从一个商业级的物联网项目分离出来的核心代码,让你绕过最难写的Socket管理,内置两个Socket,有两个数据缓冲队列,,仅一个DLL文件,调用时一个激活语句即可,之后开两个线程或定时器读数据即可...
C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据的读取与写入有较大的不同。C#串口监听的实现由于串口不知道数据何时到达,因此有两种方法可以...
基于WSAAsyncSelect异步操作TCP socket服务器 FD_READ 应用程序想要接收有关是否可读的通知,以便读入数据 FD_WRITE 应用程序想要接收有关是否可写的通知,以便写入数据 FD_OOB 应用程序想接收是否有带外(OOB)...
该资源包含了读取sqlite数据库和socket点对点上传文件的服务器,读取sqlite的类是DataAccess.cs和Default3.aspx页面,socket的例子是Default2.aspx页面
演示了Socket通信的建立方法,在客户端中连接到本机的端口号是5500,测试将数据输入流、输出流连接到socket,在输入测试时,输入半径数值发送到服务器,输入bye结束,程序会反复读用户数据并计算,服务端线程将监听...
用户之间可以通过服务器实现聊天功能。 客户机和服务器之间通过TCP通讯。 客户端使用2个线程。 线程1读取键盘输入,把键盘输入的数据通过socket发送的服务器。...线程2从socket读取数据,读到后,显示到屏幕上。
在主线程中通过控制台读取键盘...服务器在收到一个socket连接之后,把该socket保存到队列中,并对队列中的每个socket开启各自的读写线程。测试可以在不同控制台运行server和client,服务器接收消息时,会显示消息来源
其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。 可见,在应用程序端或者服务器端...
基于C#开放式TCP通信建立与西门子PLC的socket通信示例