包 | flash.net |
类 | public class Socket |
继承 | Socket EventDispatcher Object |
实现 | IDataInput, IDataOutput |
子类 | SecureSocket |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Socket 类与使用二进制协议的服务器一起使用时非常有用。
要使用 Socket 类的方法,请先使用构造函数 new Socket
创建一个 Socket 对象。
套接字以异步方式传输和接收数据。
在某些操作系统上,在执行帧之间会自动调用 flush(),但在其他操作系统(如 Windows)上,除非明确调用 flush()
,否则不会发送数据。要确保应用程序在所有操作系统上都具有可靠的功能,在将每条消息(或相关数据组)写入套接字之后,最好调用 flush()
方法。
在 Adobe AIR 中,当侦听 ServerSocket 接收到来自外部进程的连接时,也会创建 Socket 对象。Socket 对象表示在 ServerSocketConnectEvent 中调度了该连接。您的应用程序负责保持对此 Socket 对象的引用。如果不这样做,则 Socket 对象符合垃圾回收的条件,可能会在运行时损坏,但不会发出警告。
在只能与本地文件系统内容交互的安全沙箱中运行的 SWF 内容无法使用套接字。
目标主机上的套接字策略文件 指定 SWF 文件可从中建立套接字连接的主机,并指定可以建立这些连接的端口。在新近发布的几个版本的 Flash Player 中,有关套接字策略文件的安全要求变得更加严格。对于所有版本的 Flash Player,Adobe 建议使用套接字策略文件;在某些情况下,必须使用套接字策略文件。因此,如果使用的是 Socket 对象,必要时请确保目标主机提供了套接字策略文件。
以下列表汇总了各个版本的 Flash Player 中针对套接字策略文件的要求:
- 在 Flash Player 9.0.124.0 和更高版本中,任何套接字连接都要求套接字策略文件。也就是说,无论连接到哪一个端口(即使连接到提供 SWF 文件的同一主机上的端口),目标主机上都需要套接字策略文件。
- 在 Flash Player 9.0.115.0 版及更低版本中,如果要连接到小于 1024 的端口号或连接到除提供 SWF 文件的主机之外的主机,则目标主机上必须具有套接字策略文件。
- 在 Flash Player 9.0.115.0 中,尽管套接字策略文件不是必需的,但如果目标主机未提供套接字策略文件,那么当使用 Flash Debug Player 时,也会显示警告。
- 在 AIR 中,在应用程序安全沙箱中运行的内容不要求套接字策略文件。在 AIR 应用程序安全沙箱之外运行的内容建立的任何套接字连接均要求套接字策略文件。
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:安全性
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
bytesAvailable : uint [只读]
输入缓冲区中可读取的数据的字节数。 | Socket | ||
bytesPending : uint [只读]
表示写缓冲区中剩余的字节数。 | Socket | ||
connected : Boolean [只读]
表示此 Socket 对象目前是否已连接。 | Socket | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
endian : String
表示数据的字节顺序。 | Socket | ||
localAddress : String [只读]
本地计算机上此套接字绑定到的 IP 地址。 | Socket | ||
localPort : int [只读]
本地计算机上此套接字绑定到的端口。 | Socket | ||
objectEncoding : uint
在写入或读取对象时,控制所使用的 AMF 的版本。 | Socket | ||
remoteAddress : String [只读]
此套接字连接到的远程计算机的 IP 地址。 | Socket | ||
remotePort : int [只读]
此套接字连接到的远程计算机的端口。 | Socket | ||
timeout : uint
表示建立连接时需等待的毫秒数。 | Socket |
方法 | 由以下参数定义 | ||
---|---|---|---|
创建新的 Socket 对象。 | Socket | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | ||
关闭套接字。 | Socket | ||
将套接字连接到指定的主机和端口。 | Socket | ||
将事件调度到事件流中。 | EventDispatcher | ||
对套接字输出缓冲区中积累的所有数据进行刷新。 | Socket | ||
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
从套接字读取一个布尔值。 | Socket | ||
从套接字读取一个带符号字节。 | Socket | ||
从套接字读取 length 参数指定的数据字节数。 | Socket | ||
从套接字读取一个 IEEE 754 双精度浮点数。 | Socket | ||
从套接字读取一个 IEEE 754 单精度浮点数。 | Socket | ||
从套接字读取一个带符号的 32 位整数。 | Socket | ||
使用指定的字符集,从该字节流读取一个多字节字符串。 | Socket | ||
readObject():*
从以 AMF 序列化格式编码的套接字读取一个对象。 | Socket | ||
从套接字读取一个带符号的 16 位整数。 | Socket | ||
从套接字读取一个无符号字节。 | Socket | ||
从套接字读取一个无符号的 32 位整数。 | Socket | ||
从套接字读取一个无符号的 16 位整数。 | Socket | ||
从套接字读取一个 UTF-8 字符串。 | Socket | ||
从套接字读取 length 参数所指定的 UTF-8 数据的字节数,并返回一个字符串。 | Socket | ||
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object | ||
检查是否用此 EventDispatcher 对象或其任何祖代为指定事件类型注册了事件侦听器。 | EventDispatcher | ||
将一个布尔值写入套接字。 | Socket | ||
将一个字节写入套接字。 | Socket | ||
从指定的字节数组写入一系列字节。 | Socket | ||
将一个 IEEE 754 双精度浮点数写入套接字。 | Socket | ||
将一个 IEEE 754 单精度浮点数写入套接字。 | Socket | ||
将一个带符号的 32 位整数写入套接字。 | Socket | ||
使用指定的字符集,从该字节流写入一个多字节字符串。 | Socket | ||
以 AMF 序列化格式将一个对象写入套接字。 | Socket | ||
将一个 16 位整数写入套接字。 | Socket | ||
将一个无符号的 32 位整数写入套接字。 | Socket | ||
将以下数据写入套接字:一个无符号 16 位整数,它表示了指定 UTF-8 字符串的长度(以字节为单位),后面跟随字符串本身。 | Socket | ||
将一个 UTF-8 字符串写入套接字。 | Socket |
事件 | 摘要 | 由以下参数定义 | ||
---|---|---|---|---|
[广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | |||
在服务器关闭套接字连接时调度。 | Socket | |||
在建立网络连接后调度。 | Socket | |||
[广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher | |||
在出现输入/输出错误并导致发送或加载操作失败时调度。 | Socket | |||
当套接字将其写缓冲区的数据移到网络传输层时调度 | Socket | |||
若对 Socket.connect() 的调用尝试连接到调用方的安全沙箱禁止的服务器或低于 1024 的端口,且不存在允许进行此类连接的套接字策略文件,则进行调度。 | Socket | |||
在套接字接收到数据后调度。 | Socket |
bytesAvailable | 属性 |
bytesPending | 属性 |
bytesPending:uint
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11, AIR 3.0 |
表示写缓冲区中剩余的字节数。
此属性与 OutputProgressEvent 一起使用。每当将数据从写缓冲区写到网络时,便会引发 OutputProgressEvent。在该事件处理函数中,您可以检查 bytesPending
,查看还有多少数据仍留在缓冲区中等待写入。当 bytesPending
返回 0 时,说明所有数据已从写缓冲区传送到网络,可以安全执行诸如删除事件处理函数、清空套接字引用、启动队列中的下一个上载等操作。
实现
public function get bytesPending():uint
相关 API 元素
connected | 属性 |
endian | 属性 |
localAddress | 属性 |
localPort | 属性 |
objectEncoding | 属性 |
remoteAddress | 属性 |
remotePort | 属性 |
timeout | 属性 |
Socket | () | 构造函数 |
public function Socket(host:String = null, port:int = 0)
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
创建新的 Socket 对象。若未指定参数,将创建一个最初处于断开状态的套接字。若指定了参数,则尝试连接到指定的主机和端口。
注意:强烈建议使用不带参数的构造函数形式,并添加任意事件侦听器,然后使用 host
和 port
参数调用 connect
方法。此序列将确保所有事件侦听器工作正常。
host:String (default = null ) — 完全限定的 DNS 域名或 IP 地址。IPv4 地址使用十进制点符号指定,如 192.0.2.0。在 Flash Player 9.0.115.0 和 AIR 1.0 和更高版本中,可以使用十六进制冒号符号指定 IPv6 地址,如 2001:db8:ccc3:ffff:0:444d:555e:666f。也可指定 null 以连接到 SWF 文件所在的主机服务器。如果发出此调用的 SWF 文件正在 Web 浏览器中运行,则 host 必须与该 SWF 文件位于同一域中。
| |
port:int (default = 0 ) — 用于建立连接的目标主机上的 TCP 端口号。在 Flash Player 9.0.124.0 及更高版本中,目标主机必须提供套接字策略文件,以指定允许建立从提供 SWF 文件的主机到指定端口的套接字连接。在早期版本的 Flash Player 中,仅在要连接到小于 1024 的端口号或连接到除提供 SWF 文件的主机之外的主机时,才需要使用套接字策略文件。
|
事件
connect: — 在建立网络连接后调度。
| |
ioError: — 在出现输入/输出错误并由此导致连接失败时调度。
| |
securityError: —
如果对 Socket.connect() 的调用试图连接的服务器不提供套接字策略文件,或者服务器的策略文件未授予对指定端口的调用主机访问权限,则调度此事件。有关策略文件的详细信息,请参阅《ActionScript 3.0 开发人员指南》中的“网站控制(策略文件)”和 Flash Player 开发人员中心主题安全性。
|
引发
SecurityError — SWF 内容中发生此错误的原因如下:
|
close | () | 方法 |
connect | () | 方法 |
public function connect(host:String, port:int):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
将套接字连接到指定的主机和端口。
如果连接立即失败,则调度一个事件或引发一个异常。如果指定了主机,则调度一个错误事件;如果未指定主机,则引发异常。另外,连接的状态由事件来报告。如果已连接上套接字,则现有的连接将首先关闭。
参数
host:String — 要连接到的主机的名称或 IP 地址。如果未指定主机,则要连接的主机为执行调用的 文件所在的主机。如果不指定主机,请使用事件侦听器来确定连接是否成功。
| |
port:int — 要连接到的端口号。
|
事件
connect: — 在建立网络连接后调度。
| |
ioError: — 在指定了主机但出现输入/输出错误并由此导致连接失败时调度。
| |
securityError: — 如果对 Socket.connect() 的调用试图与未提供套接字策略文件的服务器进行连接,或者试图与其策略文件未授予执行调用的主机对指定端口的访问权的服务器进行连接,则调度此事件。有关策略文件的详细信息,请参阅《ActionScript 3.0 开发人员指南》中的“网站控制(策略文件)”和 Flash Player 开发人员中心主题安全性。
|
引发
IOError — 未指定任何主机,而且连接失败。
| |
SecurityError — SWF 内容中发生此错误的原因如下:
|
flush | () | 方法 |
readBoolean | () | 方法 |
readByte | () | 方法 |
readBytes | () | 方法 |
public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
从套接字读取 length 参数指定的数据字节数。从 offset
所表示的位置开始,将这些字节读入指定的字节数组。
参数
bytes:ByteArray — 要将数据读入的 ByteArray 对象。
| |
offset:uint (default = 0 ) — 数据读取的偏移量应从该字节数组中开始。
| |
length:uint (default = 0 ) — 要读取的字节数。默认值 0 导致读取所有可用的数据。
|
引发
EOFError — 可读取的数据不足。
| |
IOError — 套接字上发生 I/O 错误,或者套接字未打开。
|
readDouble | () | 方法 |
readFloat | () | 方法 |
readInt | () | 方法 |
readMultiByte | () | 方法 |
public function readMultiByte(length:uint, charSet:String):String
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
使用指定的字符集,从该字节流读取一个多字节字符串。
参数
length:uint — 要从字节流中读取的字节数。
| |
charSet:String — 表示用于解释字节的字符集的字符串。可能的字符集字符串包括 "shift_jis" 、"CN-GB" 和 "iso-8859-1" 。有关完整列表,请参阅支持的字符集。
注意:如果当前系统无法识别 |
String — UTF-8 编码的字符串。
|
引发
EOFError — 可读取的数据不足。
|
readObject | () | 方法 |
readShort | () | 方法 |
readUnsignedByte | () | 方法 |
readUnsignedInt | () | 方法 |
readUnsignedShort | () | 方法 |
readUTF | () | 方法 |
readUTFBytes | () | 方法 |
writeBoolean | () | 方法 |
writeByte | () | 方法 |
writeBytes | () | 方法 |
public function writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
从指定的字节数组写入一系列字节。写入操作从 offset
指定的位置开始。
如果省略了 length
参数,则默认长度 0 将导致该方法从 offset
开始写入整个缓冲区。
如果还省略了 offset
参数,则写入整个缓冲区。
参数
bytes:ByteArray — 要从中读取数据的 ByteArray 对象。
| |
offset:uint (default = 0 ) — bytes ByteArray 对象中从零开始的偏移量,应由此开始执行数据写入。
| |
length:uint (default = 0 ) — 要写入的字节数。默认值 0 导致从 offset 参数指定的值开始写入整个缓冲区。
|
引发
IOError — 套接字上发生 I/O 错误,或者套接字未打开。
| |
RangeError — 如果 offset 大于 bytes 指定的 ByteArray 长度;如果指定的要根据 offset 加上 length 写入的数据量超出可用数据。
|
相关 API 元素
writeDouble | () | 方法 |
writeFloat | () | 方法 |
writeInt | () | 方法 |
writeMultiByte | () | 方法 |
writeObject | () | 方法 |
writeShort | () | 方法 |
writeUnsignedInt | () | 方法 |
writeUTF | () | 方法 |
public function writeUTF(value:String):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
将以下数据写入套接字:一个无符号 16 位整数,它表示了指定 UTF-8 字符串的长度(以字节为单位),后面跟随字符串本身。
写入字符串之前,该方法会计算表示该字符串的所有字符所需的字节数。
参数
value:String — 要写入套接字的字符串。
|
引发
RangeError — 长度大于 65535。
| |
IOError — 套接字上发生 I/O 错误,或者套接字未打开。
|
相关 API 元素
writeUTFBytes | () | 方法 |
close | 事件 |
flash.events.Event
属性 Event.type =
flash.events.Event.CLOSE
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在服务器关闭套接字连接时调度。
仅在服务器关闭连接时调度 close
事件;在调用 Socket.close()
方法时不调度该事件。
Event.CLOSE
常量定义 close
事件对象的 type
属性的值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 已关闭其连接的对象。 |
connect | 事件 |
flash.events.Event
属性 Event.type =
flash.events.Event.CONNECT
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在建立网络连接后调度。
Event.CONNECT
常量定义 connect
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 已建立网络连接的 Socket 或 XMLSocket 对象。 |
ioError | 事件 |
flash.events.IOErrorEvent
属性 IOErrorEvent.type =
flash.events.IOErrorEvent.IO_ERROR
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在出现输入/输出错误并导致发送或加载操作失败时调度。
定义ioError
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
errorID | 与特定错误关联的引用编号(仅限 AIR)。 |
target | 发生输入/输出错误的网络对象。 |
text | 要显示为错误消息的文本。 |
outputProgress | 事件 |
securityError | 事件 |
flash.events.SecurityErrorEvent
属性 SecurityErrorEvent.type =
flash.events.SecurityErrorEvent.SECURITY_ERROR
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
若对 Socket.connect()
的调用尝试连接到调用方的安全沙箱禁止的服务器或低于 1024 的端口,且不存在允许进行此类连接的套接字策略文件,则进行调度。
注意:在 AIR 应用程序中,不需要套接字策略文件即允许在应用程序安全沙箱中运行的内容连接到任何服务器和端口号。
SecurityErrorEvent.SECURITY_ERROR
常量定义 securityError
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 报告安全错误的网络对象。 |
text | 要显示为错误消息的文本。 |
相关 API 元素
socketData | 事件 |
flash.events.ProgressEvent
属性 ProgressEvent.type =
flash.events.ProgressEvent.SOCKET_DATA
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在套接字接收到数据后调度。
套接字接收的数据在被读取之前一直保持在套接字中。在此事件的处理期间,您不必读取所有可用的数据。
socketData
类型的事件不使用 ProgressEvent.bytesTotal
属性。
socketData
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在处理此事件的对象。 |
bytesLoaded | 在侦听器处理事件时加载的项数或字节数。 |
bytesTotal | 0;socketData 事件对象不使用此属性。 |
target | 报告进度的套接字。 |
- 该构造函数创建
CustomSocket
实例,名为socket
,并将主机名localhost
和端口 80 作为参数传递。由于CustomSocket
扩展了 Socket,因此在调用super()
时将调用 Socket 的构造函数。 - 然后,该示例调用了
configureListeners()
方法,该方法可为 Socket 事件添加侦听器。 - 最后,调用套接字
connect()
方法,其中使用localhost
作为主机名并使用 80 作为端口号。
注意:为了运行该示例,您需要一台与 SWF 位于同一个域(在本例中为 localhost
)服务器并侦听端口 80。
package { import flash.display.Sprite; public class SocketExample extends Sprite { private var socket:CustomSocket; public function SocketExample() { socket = new CustomSocket("localhost", 80); } } } import flash.errors.*; import flash.events.*; import flash.net.Socket; class CustomSocket extends Socket { private var response:String; public function CustomSocket(host:String = null, port:uint = 0) { super(); configureListeners(); if (host && port) { super.connect(host, port); } } private function configureListeners():void { addEventListener(Event.CLOSE, closeHandler); addEventListener(Event.CONNECT, connectHandler); addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); } private function writeln(str:String):void { str += "\n"; try { writeUTFBytes(str); } catch(e:IOError) { trace(e); } } private function sendRequest():void { trace("sendRequest"); response = ""; writeln("GET /"); flush(); } private function readResponse():void { var str:String = readUTFBytes(bytesAvailable); response += str; } private function closeHandler(event:Event):void { trace("closeHandler: " + event); trace(response.toString()); } private function connectHandler(event:Event):void { trace("connectHandler: " + event); sendRequest(); } private function ioErrorHandler(event:IOErrorEvent):void { trace("ioErrorHandler: " + event); } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function socketDataHandler(event:ProgressEvent):void { trace("socketDataHandler: " + event); readResponse(); } }
Tue Jun 12 2018, 11:04 AM Z