我正在尝试构建我的简单xmpp客户端以避免使用第三方组件,因为我只需要一些非常基本的功能,例如新帐户注册和发送消息(例如基本的jabber bot)。
我不是Delphi的新手,也不是Synapse的新手(之前正在使用它的HTTPsend类),但我通过TCP / IP套接字发送数据相对较新,并且遇到了一些问题。
基本上,我已经阅读了有关XMPP协议规范的内容,并发现它处理相对简单,因为它使用XML并且有很好的解释。我开始从与XMPP服务器通信的真实客户端捕获一些数据包。我决定实施的第一项任务是创建新帐户。
以下是客户端发送给服务器的内容:
这些是初始数据包。
现在出现了问题。
我编写了以下函数来维护将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.
我希望我能很好地解释我的问题。
这些问题可能已经得到解答,但我无法找到任何方法,所以请指出我在上面的代码中需要纠正的内容(关于确定实际响应大小以及只能接收数据包) )。 感谢。