很简单。请参阅代码。如何从webassembly websocket API调用?
4
A
回答
4
示例代码连接到公共回声Web套接字服务器, 发送消息,接收响应并断开连接。
JavaScript代码提供web套接字和日志记录到webassembly代码的功能。
主程序逻辑用C编写,然后编译成wasm文件。
结果可以在js控制台中看到。
汇编:
EMCC ws_test.c -o ws_test.html -O1 -s WASM = 1 -s ONLY_MY_CODE = 1 -s EXPORTED_FUNCTIONS =“[ '_的GetBuffer', '_ wsOnMessage', '_wsOnOpen', '_test']“
结果文件ws_test.wasm很小。 (431个字节)
要检查WASM可以被反编译到可读s表达式的条件:
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>
在这里使用的编译器标记“ONLY_MY_CODE = 1”,所以结果WASM将非常小, 和不链接到任何标准库
如果模块用于算术计算该模式是方便的。
所以你不能在模式下使用:printf,malloc/free,strcpy!
如果您错过了字符串函数:strcpy,strcat,strlen ... - 您可以将函数源添加到代码中。
但是,如果你需要例如malloc/free更好的链接标准C库。
0
它只是演示,而不是产品。
toJsStr(偏移量)和toCStr(STR)可以支持UTF-8(目前仅ASCII)
toCStr应该使用不仅缓冲区偏移,而且缓冲区大小,以防止 缓冲区溢出。
错过的通讯错误处理:应使用web套接字回调: 的onerror()的OnClose()
相关问题
- 1. 使用WebAssembly调用Web API方法
- 2. 如何从HTML客户端调用Websocket?
- 3. 如何使用HTML5 WebSocket API创建Spring WebSocket应用程序?
- 4. 如何在WebAssembly中使用`indirect_call`?
- 5. 如何调试websocket应用程序
- 6. 从JavaScript调用WebAssembly中的C风格函数指针
- 7. WebAssembly将使Audio API和WebGL过时吗?
- 8. Twitter + HTML5 webSocket API
- 9. 如何从JScript或Testcomplete调用Windows API?
- 10. 如何从Android中的URL调用API
- 11. 如何从Zend_Rest_Client调用Lithium Forum API
- 12. 如何从elastalert调用elasticsearch - ELK - API?
- 13. 如何从PHP调用API url?
- 14. 如何从flickr.photos.search API调用访问XML?
- 15. 如何从PHP制作Win32 API调用?
- 16. 如何从https网站调用web api?
- 17. 如何从python调用Google Resources.calendars api。
- 18. 如何从Cygwin程序调用Win32 API
- 19. 如何从Monotouch调用私有API?
- 20. 如何从Excel中调用ajax JS API
- 21. 如何从C/C++访问WebAssembly线性内存
- 22. 如何调用API
- 23. Websocket-Node回调
- 24. 如何将C++文件编译为WebAssembly?
- 25. WebAssembly via d8.exe
- 26. WebAssembly中的着色器如何表示?
- 27. 如何在WebAssembly中实现setjmp/longjmp?
- 28. 如何从多个cpp文件编译WebAssembly?
- 29. 如何从一个WebSocket的内端点
- 30. 从React调用API