在java中实现一个xmpp客户端——卡在第一步
Posted
技术标签:
【中文标题】在java中实现一个xmpp客户端——卡在第一步【英文标题】:Implementing an xmpp client in java - stuck in the first step 【发布时间】:2012-01-27 20:15:04 【问题描述】:我正在尝试编写一个 xmpp 客户端来发送/接收来自 gtalk 的消息。
在我真正开始实施之前,我想开发一个原型,看看我是否能够将消息传递给 gtalk。
我编写了以下代码,现在卡在我应该在开始加密连接之前请求 google 的部分。
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class XmppConnect
static String initiate_conn="<?xml version=\"1.0\"?>\n\r<stream:stream to=\"google.com\"\n\rversion=\"1.0\"\n\rxmlns=\"jabber:client\"\n\rxmlns:stream=\"http://etherx.jabber.org/streams\">\n";
static String start_tls="<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>";
public static void main(String [] args)
try
Socket connection = new Socket("talk.google.com", 5222);
DataInputStream input = new DataInputStream(connection.getInputStream());
BufferedReader d = new BufferedReader(new InputStreamReader(input));
OutputStream to_server = null;
String responseLine;
to_server = connection.getOutputStream();
to_server.write(initiate_conn.getBytes());
responseLine = d.readLine();
System.out.println("Server: " + responseLine);
to_server.write(start_tls.getBytes());
responseLine = d.readLine();
System.out.println("Server: " + responseLine);
catch (UnknownHostException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
我可以将以下内容发送给谷歌
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
作为回复,我期待以下内容
<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
但我没有从服务器返回任何东西。
wireshark 截图如附件。
请求您的帮助,请不要告诉我使用已经存在的 xmpp 库,因为我只是不想这样做。
问候, 马努!
更新
找到了解决办法。工作代码如下:
目前有效的代码如下。
现在我将致力于 TLS 的实现,如果有任何疑问,我会回到这里 :) :)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class XmppConnect
static String initiate_conn="<stream:stream to=\"gmail.com\" version=\"1.0\" xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\">";
static String start_tls="<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>";
public static void main(String [] args)
try
Socket connection = new Socket("talk.google.com", 5222);
DataInputStream input = new DataInputStream(connection.getInputStream());
BufferedReader d = new BufferedReader(new InputStreamReader(input,"UTF-8"));
BufferedWriter to_server = new BufferedWriter(
new OutputStreamWriter(connection.getOutputStream(),"UTF-8")
);
String responseLine="";
to_server.write(initiate_conn);
to_server.flush();
int in;
while(!(responseLine.contains("</stream:features>")))
responseLine += (char)d.read();
System.out.println("Server: " + responseLine);
to_server.write(start_tls);
to_server.flush();
responseLine="";
while(!(responseLine.contains("<proceed xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>")))
responseLine += (char)d.read();
System.out.println("Server: " + responseLine);
catch (UnknownHostException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
【问题讨论】:
【参考方案1】:检查SMACK,它为Java 提供了一个很好的XMPP 堆栈。 它有据可查且易于使用。
【讨论】:
我正在编写自己的库,所以不能使用你建议的内容,但我一定会在卡住时参考它。谢谢【参考方案2】:也许这会对你有所帮助:
XMPP IM Client
不要这么快就关闭现有的库。您可以向他们学习,然后根据需要实施您自己的。你想重新发明***而不看***,用别人给你描述***。
【讨论】:
感谢您的回复。我完全愿意参考其他图书馆,但我不想使用一个......你提到的那个似乎很棒,我现在肯定会通过它。同时,您认为我的代码有什么问题吗?谢谢,马努 我唯一能想到的是readLine
期望以LF
、CR
或CRLF
结尾的行。尝试从您的InputStream
中逐一读取字符。
但这可能不是这种情况,因为我在wireshark中看不到来自gtalk服务器的回复......请参阅上面我的问题中所附的屏幕截图。谢谢,
我查看了屏幕截图并看到了响应 - 但也许我误解了屏幕截图。
保罗你是对的。问题确实出在 readLine 上。现在已经解决了。非常感谢...以上是关于在java中实现一个xmpp客户端——卡在第一步的主要内容,如果未能解决你的问题,请参考以下文章