非標準
This API is available on Firefox OS for privileged or certified applications only.
摘要
TCPSocket API 可開啟並使用 TCP 連線,亦可讓 Apps 開發者基於 TCP 架構,建構相關通訊協定 (如 IMAP、IRC、POP、HTTP等);甚至建立自己所需的協定以滿足特殊需求。
概述
透過 navigator.mozTCPSocket
屬性 (本身為 TCPSocket
物件) 即可存取此 API。
開啟 Socket
TCPSocket.open()
函式即可開啟 Socket。該函式共有 3 組參數:
- 以 1 組字串代表所要連線的伺服器主機名稱 (亦可為該伺服器的原始 IP 位址)。
- 以 1 組數字代表 Socket 所要使用的 TCP 通訊埠 (某些協定擁有標準埠,如 HTTP 為 80、SSL 為 447、SMTP 為 25 等。若為 1024 以上的通訊埠數字,則不會用於任何特定的通訊協定,也就是說可用於任何用途)。
- 最後是 1 組選填的物件,內含最多 2 個選項。
i.) 名為useSSL
的 Boolean 值,代表 Socket 必須使用 SSL,預設值為false。
ii.) 名為binaryType
的字串,可指定 Apps 透過 data 事件所取得的資料型態,可為string
或arraybuffer
值。預設值為string
。
var socket = navigator.mozTCPSocket.open('localhost', 80);
注意:僅限 Certified Apps 可使用 1024 以下的通訊埠。
傳送資料
TCPSocket.send()
函式將透過 1 組字串,或 1 組 Uint8Array 物件而傳送資料。另請注意,由於 TCP Socket 僅處理二進制資料,因此使用 Uint8Array 可達較高的安全性。
對 TCP 通訊協定而言,單次傳輸量最好以 64kb 為上限而能達到最佳效果。只要緩衝的資料不到 64kb,送至 send
函式的呼叫即會回傳 true。一旦緩衝區滿載
,則函式隨即回傳 false
,進而要求該 App 暫停並清空緩衝區。每次只要清空緩衝區就會發出 drain 事件,讓該 App 針對此事件再度開始傳送資料。
透過 TCPSocket.bufferedAmount
屬性,即可得知目前已緩衝的實際資料量。
function getData() { var data; // do stuff that will retrieve data return data; } function pushData() { var data; do { data = getData(); } while (data != null && socket.send(data)); } // Each time the buffer is flushed // we try to send data again. socket.ondrain = pushData; // Start sending data. pushData();
取得資料
只要 Socket 獲得主機所傳來的資料,就會發出 data 事件。App 可透過此事件而存取來自於 Socket 的資料。當 Socket 為開啟狀態時,則資料型態將根據已設定的選項而有所不同 (可參閱前述的第三種參數)。
socket.ondata = function (event) { if (typeof event.data === 'string') { console.log('Get a string: ' + event.data); } else { console.log('Get a Uint8Array'); } }
在送出所需的 data 事件之後,有時也必須暫停後續資料流入。此時呼叫 TCPSocket.suspend()
函式,即可暫停讀取後續資料並停止發送 data。若要再次開始讀取資料並發送事件,則可呼叫 TCPSocket.resume()
函式。
關閉 Socket
TCPSocket.close()
可關閉 Socket。
標準
尚未有任何規格。若要進一步了解此 API,可至 W3C 的 Raw Sockets 提案之下,參閱 System Applications Working Group 的相關討論。