Es ist einfach. Bitte beachten Sie den Code als Antwort.So rufen Sie von Webassembly Websocket-API?
Antwort
Der Beispielcode Verbindung zum öffentlichen Echo Web Socket Server, Nachricht senden, Antwort empfangen und trennen.
JavaScript-Code bietet Funktionen für den Web-Socket und die Protokollierung im Webassembly-Code.
Hauptprogramm Logik schrieb in C, die dann kompilieren, um WMF-Datei.
Ergebnisse können in js Konsole gesehen werden.
Zusammenstellung:
EMCC ws_test.c -o ws_test.html -O1 es wasm = 1 es ONLY_MY_CODE = 1 es EXPORTED_FUNCTIONS = "[ '_ GetBuffer', '_ wsOnMessage', '_wsOnOpen', '_test'] "
Ergebnisdatei ws_test.wasm ist winzig. (431 Bytes)
die wasm Um zu überprüfen, können dekompiliert zu readably s-Ausdrücke:
wasm2wast ws_test.wasm -o ws_test.wast
ws_test.c
extern void wsConnect(char *address);
extern void wsSend(char *message);
extern void wsClose();
extern void print(char *message);
char buffer[100];
char *getBuffer(){ return buffer; }
void wsOnMessage(){
print("received message");
print(buffer);
wsClose();
print("connection closed");
}
void wsOnOpen(){
print("connected");
wsSend("Hello WebAssembly !");
}
void test(){
wsConnect("ws://echo.websocket.org");
print("connecting...");
}
ws_test.html
<script>
var webSocket;
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 });
const buffer = new Uint8Array(memory.buffer);
var exports;
function toJsStr(offset){
var s="";
for(;;){
var b = buffer[offset++];
if(b == 0)
return s;
s += String.fromCharCode(b);
}
}
function toCStr(str){
var offset = exports._getBuffer();
for (var i = 0; i < str.length; ++i) {
buffer[offset++] = str.charCodeAt(i);
}
buffer[offset] = 0;
}
function print(offset){
console.log(toJsStr(offset));
}
function wsConnect(offset){
webSocket = new WebSocket(toJsStr(offset));
webSocket.onopen = function(){
console.log("Socket is open");
exports._wsOnOpen();
};
webSocket.onmessage = function (evt){
var msg = evt.data;
console.log("Message is received...");
toCStr(msg);
exports._wsOnMessage();
};
}
function wsClose(){
webSocket.close();
}
function wsSend(offset){
webSocket.send(toJsStr(offset));
}
fetch('ws_test.wasm').then(response =>
response.arrayBuffer()
).then(bytes => {
var imports = {};
imports.env = {};
imports.env.memory = memory;
imports.env.memoryBase = 0;
imports.env.table = new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' });
imports.env.tableBase = 0;
imports.env._print = print;
imports.env._wsConnect = wsConnect;
imports.env._wsSend = wsSend;
imports.env._wsClose = wsClose;
return WebAssembly.instantiate(bytes, imports);
}
).then(module => {
exports = module.instance.exports;
exports._test();
}
);
</script>
hier verwendeter Compiler-Flag ‚ONLY_MY_CODE = 1‘, so wird das Ergebnis wasm sehr klein sein, und nicht an Standardbibliotheken
Dieser Modus bequem verbunden werden, wenn das Modul für arithmetische Berechnungen verwendet wird.
So können Sie nicht im Modus verwenden: printf, malloc/free, strcpy!
Wenn Sie String-Funktionen verpasst haben: strcpy, strcat, strlen ... - Sie können die Quellcode-Funktionen hinzufügen.
Aber wenn Sie zum Beispiel malloc/free besser Link Standard-C-Bibliotheken benötigen.
Es ist nur Demo, keine Produktion.
toJsStr (Offset) und toCStr (str) könnten UTF-8 (derzeit nur ASCII)
toCStr unterstützen sollte nicht nur Offset-Puffer verwenden, aber auch die Puffergröße Pufferüberlauf zu verhindern.
Missed Kommunikationsfehlerbehandlung: web Buchse Rückrufe verwendet werden soll: onerror(), OnClose()
- 1. So rufen Sie Destructor
- 2. So rufen Sie capistrano von ansible Skript
- 3. So rufen Sie Web-Service von flex
- 4. So rufen Sie GraphViz von Java
- 5. So rufen Sie ein Fragment von Adapter
- 6. So rufen Sie localhosted API von Reactjs?
- 7. So rufen Sie Controller-Funktion von Javascript
- 8. So rufen Sie Python-Funktion von Node.JS
- 9. So rufen Sie NSBeep von Delphi
- 10. So rufen Sie Vb-Funktion von Javascript
- 11. So rufen Sie Text von UIAlertViewStylePlainTextInput ab
- 12. So rufen Sie MSBuild von C#
- 13. So rufen Sie Aktion von Ajax
- 14. So rufen Sie Haskell von Java
- 15. So rufen Sie einzelne Instanzklasse von App.xaml.cs
- 16. So rufen Sie Umgebungsdatei von Perl mmodule
- 17. So rufen Sie eine WebAPI2 von VB.NET
- 18. So rufen Sie Path.Combine von MSBuild auf?
- 19. So rufen Sie eine Funktion von $ rootScope
- 20. So rufen Sie andere Bibliotheksmethode von Reactjs
- 21. So rufen Sie DLL-Funktion von Javascript
- 22. So rufen Sie dispatch_benchmark von Swift
- 23. So rufen Sie alle Repositories von Subversion
- 24. So rufen Sie Funktionsparameter ab
- 25. So rufen Sie MainActivity-Methode
- 26. So rufen Sie die Funktion
- 27. So rufen Sie in C#
- 28. So rufen Sie onSaveInstanceState() manuell
- 29. Android - So rufen Sie Wechselkurse
- 30. So rufen Sie Monitor.TryEnter auf