包 | flash.net |
类 | public class ServerSocket |
继承 | ServerSocket EventDispatcher Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2 |
AIR 配置文件支持:所有桌面操作系统、iOS(自 AIR 3.8 起)和Android(自 AIR 3.8 起)均支持此功能。AIR for TV 设备不支持此功能。您可以使用 ServerSocket.isSupported
属性在运行时测试是否受支持。有关在多个配置文件之间支持 API 的详细信息,请参阅 AIR 配置文件支持。
TCP 服务器侦听来自远程客户端的传入连接。当客户端尝试连接时,ServerSocket 将调度 connect
事件。为此事件调度的 ServerSocketConnectEvent 对象提供了表示服务器和客户端之间 TCP 连接的 Socket 对象。将此 Socket 对象用于与连接的客户端的后续通信。如果需要,您可以从 Socket 对象获取客户端地址和端口。
注意:您的应用程序负责维持对客户端 Socket 对象的引用。如果不这样做,则该对象符合垃圾回收的条件,可能会在运行时损坏,但不会发出警告。
要使 ServerSocket 对象进入侦听状态,请调用 listen()
方法。在侦听状态下,每当使用 TCP 协议的客户端尝试连接到绑定地址和端口时,服务器 Socket 对象将调度 connect
事件。在调用 close()
方法之前,ServerSocket 对象将继续侦听其他连接。
TCP 连接是永久性的,除非连接的一方关闭此连接或发生严重网络故障,否则会一直存在。通过连接发送的任何数据会分解为可传输的数据包并在另一端进行重组。保证所有数据包到达(合理的情况下)— 会重新传输任何丢失的数据包。一般来说,TCP 协议可以比 UDP 协议更好地管理可用网络带宽。要求套接字通信的多数 AIR 应用程序应该使用 ServerSocket 和 Socket 类(而非 DatagramSocket 类)。
ServerSocket 类仅可在 Adobe AIR 应用程序和应用程序安全沙箱中使用。
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:安全性。
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
bound : Boolean [只读]
表示套接字是否绑定到本地地址和端口。 | ServerSocket | ||
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
isSupported : Boolean [静态] [只读]
表示运行时环境是否支持 ServerSocket 功能。 | ServerSocket | ||
listening : Boolean [只读]
表示服务器套接字是否侦听传入连接。 | ServerSocket | ||
localAddress : String [只读]
套接字所侦听的 IP 地址。 | ServerSocket | ||
localPort : int [只读]
套接字所侦听的端口。 | ServerSocket |
方法 | 由以下参数定义 | ||
---|---|---|---|
创建一个 ServerSocket 对象。 | ServerSocket | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | ||
将此套接字绑定到指定的本地地址和端口。 | ServerSocket | ||
关闭套接字并停止侦听连接。 | ServerSocket | ||
将事件调度到事件流中。 | EventDispatcher | ||
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示侦听绑定的 IP 地址和端口上的 TCP 连接。 | ServerSocket | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object | ||
检查是否用此 EventDispatcher 对象或其任何祖代为指定事件类型注册了事件侦听器。 | EventDispatcher |
事件 | 摘要 | 由以下参数定义 | ||
---|---|---|---|---|
[广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | |||
当操作系统关闭此套接字时调度。 | ServerSocket | |||
当远程套接字搜索到此服务器套接字的连接时调度。 | ServerSocket | |||
[广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher |
bound | 属性 |
isSupported | 属性 |
listening | 属性 |
localAddress | 属性 |
localPort | 属性 |
ServerSocket | () | 构造函数 |
public function ServerSocket()
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2 |
创建一个 ServerSocket 对象。
引发
SecurityError — 调用的内容在 AIR 应用程序安全沙箱之外运行时,发生此错误。
|
bind | () | 方法 |
public function bind(localPort:int = 0, localAddress:String = "0.0.0.0"):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2 |
将此套接字绑定到指定的本地地址和端口。
参数
localPort:int (default = 0 ) — 绑定到本地计算机的端口数量。如果将 localPort 设置为 0(默认值),则绑定下一个可用的系统端口。连接到 1024 以下的端口号的权限受系统安全策略的限制。例如,在 Mac 和 Linux 系统中,应用程序必须拥有连接到 1024 以下的端口的根权限才能运行。
| |
localAddress:String (default = "0.0.0.0 ") — 要绑定到的本地计算机上的 IP 地址。此地址可以是 IPv4 地址,也可以是 IPv6 地址。如果将 localAddress 设置为 0.0.0.0 (默认值),该套接字将侦听所有可用的 IPv4 地址。要侦听所有可用的 IPv6 地址,则必须将“::”指定为 localAddress 参数。要使用 IPv6 地址,计算机和网络必须都配置为支持 IPv6。此外,绑定到 IPv4 地址的套接字无法连接到使用 IPv6 地址的套接字。同样,绑定到 IPv6 地址的套接字无法连接到使用 IPv4 地址的套接字。地址类型必须匹配。
|
引发
RangeError — 当 localPort 小于 0 或大于 65535 时,会发生此错误。
| |
ArgumentError — 当 localAddress 在语法形式上是格式不正确的 IP 地址时,将发生此错误。
| |
IOError — 当套接字无法绑定时,如出现下列情况时:
|
close | () | 方法 |
listen | () | 方法 |
public function listen(backlog:int = 0):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2 |
表示侦听绑定的 IP 地址和端口上的 TCP 连接。
listen()
方法立即返回。调用 listen()
之后,只要尝试连接,ServerSocket 对象就会调度 connect
事件。ServerSocketConnectEvent 事件对象的 socket
属性引用表示服务器-客户端连接的 Socket 对象。
backlog
参数指定当应用程序处理 connect
事件时排队的挂起连接数。如果队列已满,则无需调度 connect
事件即可拒绝其他连接。如果指定了默认值零,则使用系统最大队列长度。此长度随平台不同而不同,可以根据计算机进行配置。如果指定值超出系统最大长度,则使用系统最大长度。未提供查找实际 backlog 值的方法。(系统最大值取决于主机上 TCP 网络子系统的 SOMAXCONN 设置。)
参数
backlog:int (default = 0 ) — 挂起连接的最大队列长度。如果 backlog 是 0,队列长度将设置为系统最大值。
|
引发
IOError — 如果套接字未打开或绑定,则发生此错误。如果对 listen() 的调用由于任何其他原因而失败时也会发生此错误。
| |
RangeError — 如果 backlog 参数小于零,则发生此错误。
|
close | 事件 |
flash.events.Event
属性 Event.type =
flash.events.Event.CLOSE
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2 |
当操作系统关闭此套接字时调度。
调用 ServerSocket close()
方法时并不调度 close
事件。如果应用程序中的其他对象依靠 close
事件,可在调用 close()
方法之前手动调度此事件。
Event.CLOSE
常量定义 close
事件对象的 type
属性的值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 已关闭其连接的对象。 |
connect | 事件 |
flash.events.ServerSocketConnectEvent
属性 ServerSocketConnectEvent.type =
flash.events.ServerSocketConnectEvent.CONNECT
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 2 |
当远程套接字搜索到此服务器套接字的连接时调度。
定义ServerSocketConnectEvent
事件对象 type
属性的值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false . |
cancelable | false ,没有可取消的默认行为。 |
currentTarget | 此 ServerSocket 对象。 |
target | 此 ServerSocket 对象。 |
socket | 表示新连接的 Socket 对象。 |
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.ProgressEvent; import flash.events.ServerSocketConnectEvent; import flash.net.ServerSocket; import flash.net.Socket; import flash.text.TextField; import flash.text.TextFieldType; import flash.utils.ByteArray; public class ServerSocketExample extends Sprite { private var serverSocket:ServerSocket = new ServerSocket(); private var clientSocket:Socket; private var localIP:TextField; private var localPort:TextField; private var logField:TextField; private var message:TextField; public function ServerSocketExample() { setupUI(); } private function onConnect( event:ServerSocketConnectEvent ):void { clientSocket = event.socket; clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData ); log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort ); } private function onClientSocketData( event:ProgressEvent ):void { var buffer:ByteArray = new ByteArray(); clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable ); log( "Received: " + buffer.toString() ); } private function bind( event:Event ):void { if( serverSocket.bound ) { serverSocket.close(); serverSocket = new ServerSocket(); } serverSocket.bind( parseInt( localPort.text ), localIP.text ); serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, onConnect ); serverSocket.listen(); log( "Bound to: " + serverSocket.localAddress + ":" + serverSocket.localPort ); } private function send( event:Event ):void { try { if( clientSocket != null && clientSocket.connected ) { clientSocket.writeUTFBytes( message.text ); clientSocket.flush(); log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort ); } else log("No socket connection."); } catch ( error:Error ) { log( error.message ); } } private function log( text:String ):void { logField.appendText( text + "\n" ); logField.scrollV = logField.maxScrollV; trace( text ); } private function setupUI():void { localIP = createTextField( 10, 10, "Local IP", "0.0.0.0"); localPort = createTextField( 10, 35, "Local port", "0" ); createTextButton( 170, 60, "Bind", bind ); message = createTextField( 10, 85, "Message", "Lucy can't drink milk." ); createTextButton( 170, 110, "Send", send ); logField = createTextField( 10, 135, "Log", "", false, 200 ) this.stage.nativeWindow.activate(); } private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField { var labelField:TextField = new TextField(); labelField.text = label; labelField.type = TextFieldType.DYNAMIC; labelField.width = 100; labelField.x = x; labelField.y = y; var input:TextField = new TextField(); input.text = defaultValue; input.type = TextFieldType.INPUT; input.border = editable; input.selectable = editable; input.width = 280; input.height = height; input.x = x + labelField.width; input.y = y; this.addChild( labelField ); this.addChild( input ); return input; } private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField { var button:TextField = new TextField(); button.htmlText = "<u><b>" + label + "</b></u>"; button.type = TextFieldType.DYNAMIC; button.selectable = false; button.width = 180; button.x = x; button.y = y; button.addEventListener( MouseEvent.CLICK, clickHandler ); this.addChild( button ); return button; } } }
Tue Jun 12 2018, 11:04 AM Z