我正在尝试从网络套接字读取,以使用gnome扩展中的信息。为此,我正在使用Gio socketclient。我能够从输入流连接和读取同步。但我在异步阅读中失败了。我已经在以下脚本中找出了我的问题:
#!/usr/bin/gjs
const Gio = imports.gi.Gio;
var doAsyncCallBack = function(gobject, async_res, user_data) {
print("ASYNC test: doCallBack");
let lineout, charlength, error;
[lineout, charlength, error] = gobject.read_upto_finish(async_res);
print("ASYNC test: " + lineout + " (" + charlength + ")");
};
let sc = new Gio.SocketClient();
let scc = sc.connect_to_host("kodi", 9090, null);
let dis = new Gio.DataInputStream({ base_stream: scc.get_input_stream() });
//sync
print("sync test: started");
let valuestr, valueint;
[valuestr, valueint] = dis.read_upto("}" , -1, null);
print("sync test: " + valuestr + " (" + valueint + ")");
//async
print("ASYNC test: started");
dis.read_upto_async("}" , -1, 0, null, doAsyncCallBack);
// keep in a loop.
print("(press [crtl-c] to end)");
while (0 == 0) {};
在我的例子中,永远不会调用“doAsyncCallBack”函数。同步调用有效,因此服务器正在给出适当的响应。
我在此处找到的部分信息,但(kodi)服务器未发送新行:gjs How to read a socket stream in Gnome Shell Extension using g_data_input_stream_read_line_async
答案 0 :(得分:0)
我发现了回调在我的脚本中不起作用的原因。基本上它是代码的最后一部分。
// while (0 == 0) {};
Clutter.init(null);
Clutter.main();
这就是我必须做的,让它发挥作用。