Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java实现XMPP中的基本连接_Java_Sockets_Xmpp - Fatal编程技术网

使用Java实现XMPP中的基本连接

使用Java实现XMPP中的基本连接,java,sockets,xmpp,Java,Sockets,Xmpp,我试图理解基本的xmpp客户机-服务器通信。我已经安装了ejabberd服务器并用jitsi进行了测试。现在,我可以从Java发送第一个流xml并从服务器获得响应 <?xml version='1.0'?> <stream:stream to='192.168.1.18' version='1.0' xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams'>

我试图理解基本的xmpp客户机-服务器通信。我已经安装了ejabberd服务器并用jitsi进行了测试。现在,我可以从Java发送第一个流xml并从服务器获得响应

<?xml version='1.0'?>
    <stream:stream to='192.168.1.18' 
        version='1.0' xmlns='jabber:server' 
    xmlns:stream='http://etherx.jabber.org/streams'>

服务器用

<?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='13712777409692765897' from='192.168.1.18' version='1.0' xml:lang='en'><stream:features><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='GtsjYPujnBb89z2vC8P/arjzmdE='/><register xmlns='http://jabber.org/features/iq-register'/><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><compression xmlns='http://jabber.org/features/compress'><method>zlib</method></compression><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>SCRAM-SHA-1</mechanism><mechanism>PLAIN</mechanism><mechanism>X-OAUTH2</mechanism></mechanisms></stream:features>
zlibSCRAM-SHA-1PLAINX-OAUTH2
根据XMPP编程客户机指南,在服务器响应后,客户机必须发送iq进行注册,即

<iq type='get' to='shakespeare.lit' id='auth1'>
          <query xmlns='jabber:iq:auth'>
             <username>bill</username>
          </query>
      </iq>

账单
服务器将以

<iq type='result' id='auth1'>
          <query xmlns='jabber:iq:auth'>
              <username/>
              <password/>
              <digest/>
              <resource/>
          </query>
      </iq>

之后,客户端将再次发送带有用户名和密码的iq。 现在我正在尝试做同样的事情,但是在第一次响应之后,进一步的服务器响应是空的。我的代码如下

public static void Sock() throws IOException, InterruptedException{

    String connect="<?xml version='1.0'?> "
            + "<stream:stream "
            + "to='192.168.1.18' version='1.0' "
            + "xmlns='jabber:server' "
            + "xmlns:stream='http://etherx.jabber.org/streams'> ";

    String msg="<iq type='get' to='192.168.1.18' id='auth1'> "
            + "<query xmlns='jabber:iq:auth'> "
            + "<username>junaid</username> "
            + "</query> "
            + "</iq>";

        Socket socket = null; 
        try
            {
                String host = "192.168.1.18";
                int port = 5222;
                InetAddress address = InetAddress.getByName(host);
                 socket = new Socket(address, port);
                 socket.setKeepAlive(true);
                //Send the message to the server
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write(connect);
                bw.flush();
                System.out.println("Message sent to the server : "+connect);

                //Get the return message from the server
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String message = br.readLine();
                System.out.println("Message received from the server : " +message);
                System.out.println(socket.isConnected());
                ///////Message
                bw.write(msg);
                bw.flush();
                System.out.println("Message sent to the server : "+msg);
                System.out.println(socket.isConnected());
                //Get the return message from the server
                is = socket.getInputStream();
                isr = new InputStreamReader(is);
                br = new BufferedReader(isr);
                message = br.readLine();
                System.out.println("Message received from the server : " +message);

            }
            catch (Exception exception)
            {
                exception.printStackTrace();
            }
            finally
            {
                //Closing the socket
                try
                {
                    socket.close();
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }

    }
publicstaticvoidsock()抛出IOException、InterruptedException{
String connect=“”
+ " ";
字符串msg=“”
+ " "
+“朱奈德”
+ " "
+ "";
套接字=空;
尝试
{
字符串host=“192.168.1.18”;
int端口=5222;
InetAddress=InetAddress.getByName(主机);
套接字=新套接字(地址、端口);
socket.setKeepAlive(true);
//将消息发送到服务器
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=新的OutputStreamWriter(os);
BufferedWriter bw=新的BufferedWriter(osw);
写入(连接);
bw.flush();
System.out.println(“发送到服务器的消息:“+connect”);
//从服务器获取返回消息
InputStream=socket.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(isr);
字符串消息=br.readLine();
System.out.println(“从服务器收到的消息:“+消息”);
System.out.println(socket.isConnected());
///////信息
bw.write(msg);
bw.flush();
System.out.println(“发送到服务器的消息:“+msg”);
System.out.println(socket.isConnected());
//从服务器获取返回消息
is=socket.getInputStream();
isr=新的InputStreamReader(is);
br=新的缓冲读取器(isr);
message=br.readLine();
System.out.println(“从服务器收到的消息:“+消息”);
}
捕获(异常)
{
异常。printStackTrace();
}
最后
{
//合上插座
尝试
{
socket.close();
}
捕获(例外e)
{
e、 printStackTrace();
}
}
}
我是套接字编程新手,所以如果有人能告诉我我做错了什么,我将非常感激。 上述函数的输出为

 Message sent to the server : <?xml version='1.0'?>
    <stream:stream to='192.168.1.18' 
        version='1.0' xmlns='jabber:server' 
        xmlns:stream='http://etherx.jabber.org/streams'>
Message received from the server : <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='13712777409692765897' from='192.168.1.18' version='1.0' xml:lang='en'><stream:features><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='GtsjYPujnBb89z2vC8P/arjzmdE='/><register xmlns='http://jabber.org/features/iq-register'/><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><compression xmlns='http://jabber.org/features/compress'><method>zlib</method></compression><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>SCRAM-SHA-1</mechanism><mechanism>PLAIN</mechanism><mechanism>X-OAUTH2</mechanism></mechanisms></stream:features>
true
Message sent to the server : <iq type='get' to='192.168.1.18' id='auth1'>
    <query xmlns='jabber:iq:auth'>
        <username>junaid</username>
    </query>
</iq>

true
Message received from the server : null
发送到服务器的消息:
从服务器收到的消息:zlibSCRAM-SHA-1PLAINX-OAUTH2
真的
发送到服务器的消息:
朱奈德
真的
从服务器收到的消息:null

请不要重新发明轮子——只要使用已经编写良好的XMPP框架即可。我可以推荐library—它将为您提供漂亮干净的API,您无需手动构造或解析XML

我不是,我只是想了解通信过程