套件 | 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
事件。針對提供 Socket 物件 (代表在伺服器及用戶端之間的 TCP 連線) 的事件,會傳送 ServerSocketConnectEvent 物件。對於已連線之用戶端的後續通訊使用這個 Socket 物件。如有必要,您可以從 Socket 物件取得用戶端位址。
注意:您的應用程式負責維護用戶端 Socket 物件的參考。如果不是,則物件容易被當成垃圾收集起來,且執行階段可能會刪除它而不加以警告。
若要將 ServerSocket 物件放入偵聽狀態,請呼叫 listen()
方法。在偵聽狀態,每次用戶端使用 TCP 通訊協定嘗試連線到繫結的位址及連接埠時,伺服器 Socket 物件會傳送 connect
事件。ServerSocket 物件持續偵聽其它的連線,直到您呼叫 close()
方法。
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 系統,應用程式必須以 root 權限執行才能連線到 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 物件。
當 connect
事件由您的應用程式執行時,backlog
參數指定多少擱置連線還在佇列中。如果佇列是滿的,其他的連線會被拒絕,不會傳送 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, 03:47 PM Z