TCP Socket

非標準

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. 以 1 組字串代表所要連線的伺服器主機名稱 (亦可為該伺服器的原始 IP 位址)。
  2. 以 1 組數字代表 Socket 所要使用的 TCP 通訊埠 (某些協定擁有標準埠,如 HTTP 為 80、SSL 為 447、SMTP 為 25 等。若為 1024 以上的通訊埠數字,則不會用於任何特定的通訊協定,也就是說可用於任何用途)。
  3. 最後是 1 組選填的物件,內含最多 2 個選項。
    i.) 名為 useSSL 的 Boolean 值,代表 Socket 必須使用 SSL,預設值為 false。
    ii.) 名為 binaryType 的字串,可指定 Apps 透過 data 事件所取得的資料型態,可為 stringarraybuffer 值。預設值為 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 的相關討論。

另可參閱

文件標籤與貢獻者

 此頁面的貢獻者: MashKao
 最近更新: MashKao,