Javascript gjs如何使用g_data_input_stream_read_line_async在Gnome外壳扩展中读取套接字流
我正试图编写一个Gnome外壳扩展,它通过套接字服务器与Arduino通信。服务器和Arduino运行良好,但我仍停留在侦听传入服务器消息的扩展代码上 因为我需要一个非阻塞的方法,所以使用它看起来很完美 然而,我不能设法让它工作。以下是我到目前为止得到的信息(相关部分): 当从服务器接收到一行数据时,异步函数可以正常启动,并且调用Javascript gjs如何使用g_data_input_stream_read_line_async在Gnome外壳扩展中读取套接字流,javascript,sockets,asynchronous,gnome,gjs,Javascript,Sockets,Asynchronous,Gnome,Gjs,我正试图编写一个Gnome外壳扩展,它通过套接字服务器与Arduino通信。服务器和Arduino运行良好,但我仍停留在侦听传入服务器消息的扩展代码上 因为我需要一个非阻塞的方法,所以使用它看起来很完美 然而,我不能设法让它工作。以下是我到目前为止得到的信息(相关部分): 当从服务器接收到一行数据时,异步函数可以正常启动,并且调用\u SocketRead,但它无法使用read\u line\u finish()读取数据 我对gio和扩展开发完全陌生,所以我可能会错过一些明显的东西 在我看来,r
\u SocketRead
,但它无法使用read\u line\u finish()
读取数据
我对gio和扩展开发完全陌生,所以我可能会错过一些明显的东西
在我看来,read\u line\u finish()
可能缺少它的参数,但我不知道如何实现它
编辑:
回调函数和read_line_finish()缺少其参数。
多亏了格德的回答,我才得以成功。帮助我找出“描述”下链接的示例。下面是用于比较的工作代码:
let sockClient, sockConnection, output_reader, receivedline;
// connect to socket
sockClient = new Gio.SocketClient();
sockConnection = sockClient.connect_to_host("127.0.0.1:21567", null, null);
// read server socket
output_reader = new Gio.DataInputStream({ base_stream: sockConnection.get_input_stream() });
output_reader.read_line_async(0, null, _SocketRead, null);
// callback
function _SocketRead(gobject, async_res, user_data) {
let [lineout, charlength, error] = gobject.read_line_finish(async_res);
receivedline = lineout;
// process received data
}
我也是GJS新手,但对编程语言的扎实理解使我找到了以下部分解决方案:根据您的要求,必须为该方法提供所有必需的参数,例如
let asyncResult = new Gio.SimpleAsyncResult();
let length;
let lineout = output_reader.read_line_finish(asyncResult, length);
嗯,,
Gerd非常感谢。这帮助我解决了这个问题;)太好了,你介意发布你的最终解决方案吗?如果其他人遇到类似的问题,你可以让他们看看吗?当然可以。我已经用更新的代码编辑了我的初始问题。Gnome3的完整扩展可以在这里找到:
let asyncResult = new Gio.SimpleAsyncResult();
let length;
let lineout = output_reader.read_line_finish(asyncResult, length);