使用Synapse的简单XMPP客户端

时间:2015-08-02 10:09:50

标签: delphi xmpp synapse

我正在尝试构建我的简单xmpp客户端以避免使用第三方组件,因为我只需要一些非常基本的功能,例如新帐户注册和发送消息(例如基本的jabber bot)。

我不是Delphi的新手,也不是Synapse的新手(之前正在使用它的HTTPsend类),但我通过TCP / IP套接字发送数据相对较新,并且遇到了一些问题。

基本上,我已经阅读了有关XMPP协议规范的内容,并发现它处理相对简单,因为它使用XML并且有很好的解释。我开始从与XMPP服务器通信的真实客户端捕获一些数据包。我决定实施的第一项任务是创建新帐户。

以下是客户端发送给服务器的内容:

http://notepad.cc/faxije16

这些是初始数据包。

现在出现了问题。

我编写了以下函数来维护将xml发送到服务器并读取响应

function sndq(const query: string;sock: ttcpblocksocket): string;
var c: string;
i: integer;
begin
     result:='';
     sock.SendString(query);
     c:='';
   for i := 0 to 5000 do begin
       c:=Sock.RecvBufferStr(1, 2500);
       result := result + c;
     end;// for i

端;:

首先,我觉得做这件事是非常错误的,但我尝试使用sock.waitingdata和waitingdataex,但它以某种方式返回错误的值(少于实际的响应大小)。

但更大的问题是我只能收到第一个数据包。所以这是我写的代码:

var sock: ttcpblocksocket;
begin
  sock:=ttcpblocksocket.Create;
  sock.Connect('exploit.im','5222');
  writeln(sndq('<stream:stream to="exploit.im" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" xml:lang="ru" version="1.0" />',sock)); // goes well as I get that same initial packet as the client
  writeln('----------');
  writeln(sndq('<iq type="get" id="qip_0"><query xmlns="jabber:iq:register" /></iq>',sock)); // шлем запрос точно как у Квипа // prints empty line
readln; end.

我希望我能很好地解释我的问题。

这些问题可能已经得到解答,但我无法找到任何方法,所以请指出我在上面的代码中需要纠正的内容(关于确定实际响应大小以及只能接收数据包) )。 感谢。

0 个答案:

没有答案