我正在尝试编写一个 Gnome-Shell 扩展,通过 Socket 服务器与 Arduino 进行通信。服务器和 Arduino 运行良好,但我陷入了监听传入服务器消息的扩展代码。
因为我需要一种非阻塞方法,所以使用异步读取行 https://developer.gnome.org/gio/stable/GDataInputStream.html#g-data-input-stream-read-line-async看起来很完美。
但是我无法让它工作。这是我到目前为止所得到的(相关部分):
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() {
let [lineout, charlength, error] = output_reader.read_line_finish();
receivedline = lineout;
// process received data
}
异步函数启动得很好,而且_SocketRead
当从服务器收到一行但无法读取数据时被调用read_line_finish()
.
我对 gio 和扩展开发完全陌生,所以我可能会错过一些明显的东西。
对我来说似乎read_line_finish()
可能缺少它的GAsync结果 https://developer.gnome.org/gio/stable/GAsyncResult.html参数,但我不知道如何实现它。
EDIT:
回调函数和 read_line_finish() 缺少参数。
感谢 Gerd 的回答,我才得以成功。帮助我弄清楚了链接中的示例吉奥参考 https://developer.gnome.org/gio/stable/GAsyncResult.html在“描述”下。所以这是用于比较的工作代码:
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
}