Emscripten 編譯的應用程式有多種方式可連線至線上伺服器。請查看此處的子主題,以瞭解可用的不同策略。
如果您熟悉不同 Web API(例如 XmlHttpRequest、Fetch、WebSockets 和 WebRTC)提供的網路概念,您可以透過利用您已知的知識快速入門:透過從 C/C++ 程式碼呼叫 JavaScript(請參閱「連接 C++ 和 JavaScript」章節),您可以撰寫常規 JavaScript 來建立網路連線。對於 C/C++ 開發人員,Emscripten 提供了一些方法,此處會加以說明。
WebSockets API 提供連線導向的訊息框架雙向非同步網路通訊至瀏覽器。它是網頁可以存取的最接近網頁上的 TCP 的方式,無法從網頁瀏覽器直接存取 TCP Socket。
Emscripten 提供傳遞 API,可從 C/C++ 程式碼存取 WebSockets API。這對於不想撰寫任何 JavaScript 程式碼,或處理 C/C++ 和 JavaScript 語言互通性的開發人員很有用。請參閱系統包含檔案 <emscripten/websocket.h>
以取得詳細資訊。Emscripten WebSockets API 比 JavaScript 中的手動 WebSockets 存取提供的一個好處是,能夠跨多個執行緒共用對 WebSocket 控制代碼的存取,這可能需要花費時間才能從頭開始開發。
若要以 Emscripten WebSockets API 為目標,您必須使用 -lwebsocket.js
連結器指令連結它。
如果您有現有的 C/C++ TCP 網路程式碼使用 Posix Sockets API,依預設,Emscripten 會嘗試模擬透過 WebSocket 通訊協定進行的此類連線。若要使此功能正常運作,您需要在伺服器端使用類似 WebSockify 的工具,以讓 TCP 伺服器堆疊接收傳入的 WebSocket 連線。此模擬目前並不完整,您可能開箱即用就會遇到問題,並且需要調整程式碼以在此模擬提供的限制內工作。
這是 Emscripten 的預設建置模式。使用連結器旗標 -sWEBSOCKET_URL
或 Module['websocket']['url']
來指定要連線的 WebSocket URL,並使用連結器旗標 -sWEBSOCKET_SUBPROTOCOL
或 Module['websocket']['subprotocol']
來控制連線類型('binary'
或 'text'
)。
Emscripten 提供原生 POSIX Sockets Proxy 伺服器程式,該程式位於目錄 tools/websocket_to_posix_proxy/
中,可允許從網頁瀏覽器完整存取 POSIX Sockets API。此支援的運作方式是將所有 POSIX Sockets API 呼叫從瀏覽器 Proxy 至 Emscripten POSIX Sockets Proxy 伺服器(透過透明使用 WebSockets API),然後 Proxy 伺服器會代表網頁執行原生 TCP/UDP 呼叫。這允許網頁瀏覽器網頁執行完整的 TCP 和 UDP 連線,作為伺服器接受傳入的連線,以及執行主機名稱查詢和反向查詢。由於所有 API 呼叫都是個別 Proxy 的,因此此支援可能會很慢。此支援主要適用於開發測試基礎結構和除錯。
socket()
、socketpair()
、shutdown()
、bind()
、connect()
、listen()
、accept()
、getsockname()
、getpeername()
、send()
、recv()
、sendto()
、recvfrom()
、sendmsg()
、recvmsg()
、getsockopt()
、setsockopt()
、getaddrinfo()
、getnameinfo()
。
poll()
、close()
(改用 shutdown()
)、select()
若要使用 POSIX Socket Proxy,請使用旗標 -lwebsocket.js -sPROXY_POSIX_SOCKETS -pthread -sPROXY_TO_PTHREAD
連結應用程式。也就是說,POSIX Socket Proxy 是在 Emscripten WebSockets 程式庫的基礎上建置的,並且需要多執行緒,以及將應用程式 main()
Proxy 至 pthread。
如需瞭解 POSIX Socket Proxy 伺服器如何在 Emscripten 用戶端程式中運作的範例,請參閱檔案 test/websocket/tcp_echo_client.c
。
對於 HTTP 傳輸,可以使用瀏覽器內建的 XmlHttpRequest (XHR) API 和較新的 Fetch API。這些可以直接從 JavaScript 存取。Emscripten 也提供傳遞 API 來執行 HTTP 要求。如需詳細資訊,請參閱 emscripten_async_wget*()
C API 和 Emscripten Fetch API。
瀏覽器中無法使用直接 UDP 通訊,但作為接近的替代方案,WebRTC 規範提供機制,可使用 WebRTC 資料通道執行類似 UDP 的通訊。目前 Emscripten 不提供 C/C++ API 來與 WebRTC 互動。