XMPP:连接关闭时出错!解析器收到END_DOCUMENT事件。

7
我正试图登录我创建的 Android 应用程序,其认证将使用在 ejabberd 中注册的用户名和密码进行。连接已成功建立,但我无法登录。它会给出一个错误,即 - "ConnectionClosedOnError!解析器收到了 END_DOCUMENT 事件。如果服务器关闭连接而没有发送关闭流元素,则可能会发生这种情况"。
日志如下:
04-15 19:27:45.052 31421-31421/com.synergy.allie.ecm D/calling xmpp connect: started

04-15 19:27:45.052 31421-31749/com.synergy.allie.ecm D/Connect() Function: =>connecting....

04-15 19:27:45.072 31421-31421/com.synergy.allie.ecm D/LoginActivity: onServiceConnected

04-15 19:27:45.102 31421-31751/com.synergy.allie.ecm I/System.out: 07:27:45 PM SENT (0): http://etherx.jabber.org/streams' version='1.0' xml:lang='en'>

04-15 19:27:45.102 31421-31752/com.synergy.allie.ecm I/System.out: 07:27:45 PM RECV (0): http://etherx.jabber.org/streams' id='284868730' from='allen' version='1.0' xml:lang='en'>

04-15 19:27:45.102 31421-31752/com.synergy.allie.ecm I/System.out: 07:27:45 PM RECV (0): http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='SLr01mk3X636tk4sDXYXPXsNNcE='/>http://jabber.org/features/iq-register'/>PLAINDIGEST-MD5SCRAM-SHA-1

04-15 19:27:45.142 31421-31749/com.synergy.allie.ecm D/xmpp: Connected!

04-15 19:28:45.102 31421-31752/com.synergy.allie.ecm W/AbstractXMPPConnection: Connection closed with error org.jivesoftware.smack.SmackException: Parser got END_DOCUMENT event. This could happen e.g. if the server closed the connection without sending a closing stream element at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1148) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:937) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:952) at java.lang.Thread.run(Thread.java:856)

04-15 19:28:45.112 31421-31752/com.synergy.allie.ecm D/xmpp: ConnectionClosedOn Error! Parser got END_DOCUMENT event. This could happen e.g. if the server closed the connection without sending a closing stream element

public class MyXMPP 
{
public static boolean connected = false;
public boolean loggedin = false;
public static boolean isconnecting = false;
public static boolean isToasted = true;
private boolean chat_created = false;
private String serverAddress;
public static XMPPTCPConnection connection;
public static String loginUser;
public static String passwordUser;
Gson gson;
MyService context;
public static MyXMPP instance = null;
public static boolean instanceCreated = false;
public org.jivesoftware.smack.chat.Chat Mychat;
ChatManagerListenerImpl mChatManagerListener;
MMessageListener mMessageListener;
Boolean logon;

public MyXMPP(MyService context, String serverAdress, String logiUser,
              String passwordser) {
    this.serverAddress = serverAdress;
    this.loginUser = logiUser;
    this.passwordUser = passwordser;
    this.context = context;
    init();

}

public static MyXMPP getInstance(MyService context, String server,
                                 String user, String pass) {

    if (instance == null) {
        instance = new MyXMPP(context, server, user, pass);
        instanceCreated = true;
    }
    return instance;
}


String text = "";
String mMessage = "", mReceiver = "";
static {
    try {
        Class.forName("org.jivesoftware.smack.ReconnectionManager");
    } catch (ClassNotFoundException ex) {
        // problem loading reconnection manager
    }
}

public void init() {
    gson = new Gson();
    mMessageListener = new MMessageListener(context);
    mChatManagerListener = new ChatManagerListenerImpl();
    initialiseConnection();

}

private void initialiseConnection() {

    XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
    config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
    config.setServiceName(serverAddress);
    config.setHost("***.***.***.***");
    config.setPort(5222);
    config.setDebuggerEnabled(true);
    XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
    XMPPTCPConnection.setUseStreamManagementDefault(true);
    connection = new XMPPTCPConnection(config.build());
    XMPPConnectionListener connectionListener = new XMPPConnectionListener();
    connection.addConnectionListener(connectionListener);

}

public void disconnect() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            connection.disconnect();
        }
    }).start();
}

public void connect(final String caller) {

    AsyncTask<Void, Void, Boolean> connectionThread = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected synchronized Boolean doInBackground(Void... arg0) {
            if (connection.isConnected())
                return false;
            isconnecting = true;
            if (isToasted)
                new Handler(Looper.getMainLooper()).post(new Runnable() {

                    @Override
                    public void run() {

                        Toast.makeText(context, caller + "Trying to establish a connection!", Toast.LENGTH_LONG).show();
                    }
                });
            Log.d("Connect() Function", caller + "=>connecting....");

            try {
                connection.connect();
                DeliveryReceiptManager dm = DeliveryReceiptManager
                        .getInstanceFor(connection);
                dm.setAutoReceiptMode(AutoReceiptMode.always);
                dm.addReceiptReceivedListener(new ReceiptReceivedListener() {

                    @Override
                    public void onReceiptReceived(final String fromid,
                                                  final String toid, final String msgid,
                                                  final Stanza packet) {

                    }
                });
                connected = true;

            } catch (IOException e) {
                if (isToasted)
                    new Handler(Looper.getMainLooper())
                            .post(new Runnable() {

                                @Override
                                public void run() {

                                    Toast.makeText(context, "(" + caller + ")" + "IOException: ",
                                            Toast.LENGTH_SHORT).show();
                                }
                            });

                Log.e("(" + caller + ")", "IOException: " + e.getMessage());
            } catch (SmackException e) {
                new Handler(Looper.getMainLooper()).post(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(context, "(" + caller + ")" + "SMACKException: ",
                                Toast.LENGTH_SHORT).show();
                    }
                });
                Log.e("(" + caller + ")", "SMACKException: " + e.getMessage());
            } catch (XMPPException e) {
                if (isToasted)

                    new Handler(Looper.getMainLooper())
                            .post(new Runnable() {

                                @Override
                                public void run() {

                                    Toast.makeText(context, "(" + caller + ")" + "XMPPException: ",
                                            Toast.LENGTH_SHORT).show();
                                }
                            });
                Log.e("connect(" + caller + ")",
                        "XMPPException: " + e.getMessage());

            }
            return isconnecting = false;
        }
    };
    connectionThread.execute();
}

public void login()
{
    try
    {
        connection.login(loginUser, passwordUser);
        Log.i("LOGIN", "Praise Jesus! We're connected to the Xmpp server!");
        logon=true;
    }
    catch (XMPPException | SmackException | IOException e)
    {
        logon=false;
        e.printStackTrace();
    }
    catch (Exception e)
    {
        logon=false;
    }
}

private class ChatManagerListenerImpl implements ChatManagerListener {
    @Override
    public void chatCreated(final org.jivesoftware.smack.chat.Chat chat,
                            final boolean createdLocally) {
        if (!createdLocally)
            chat.addMessageListener(mMessageListener);

    }

}

public void sendMessage(ChatMessage chatMessage) {
    String body = gson.toJson(chatMessage);

    if (!chat_created) {
        Mychat = ChatManager.getInstanceFor(connection).createChat(chatMessage.receiver
                        + "@" + context.getString(R.string.server),
                mMessageListener);
        chat_created = true;
    }
    final Message message = new Message();
    message.setBody(body);
    message.setStanzaId(chatMessage.msgid);
    message.setType(Message.Type.chat);

    try {
        if (connection.isAuthenticated()) {

            Mychat.sendMessage(message);

        } else {

            login();
        }
    } catch (NotConnectedException e) {
        Log.e("xmpp.SendMessage()", "msg Not sent!-Not Connected!");

    } catch (Exception e) {
        Log.e("xmpp.SendMessage()", "msg Not sent!" + e.getMessage());
    }

}

public class XMPPConnectionListener implements ConnectionListener {
    @Override
    public void connected(final XMPPConnection connection) {

        Log.d("xmpp", "Connected!");
        connected = true;
        if (!connection.isAuthenticated()) {
            login();
        }
    }

    @Override
    public void connectionClosed() {
        if (isToasted)

            new Handler(Looper.getMainLooper()).post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                    Toast.makeText(context, "ConnectionCLosed!",
                            Toast.LENGTH_SHORT).show();

                }
            });
        Log.d("xmpp", "ConnectionCLosed!");
        connected = false;
        chat_created = false;
        loggedin = false;
    }

    @Override
    public void connectionClosedOnError(Exception arg0) {
        if (isToasted)

            new Handler(Looper.getMainLooper()).post(new Runnable() {

                @Override
                public void run() {
                    Toast.makeText(context, "ConnectionClosedOn Error!!",
                            Toast.LENGTH_SHORT).show();

                }
            });
        Log.d("xmpp", "ConnectionClosedOn Error! "+arg0.getMessage());
        connected = false;

        chat_created = false;
        loggedin = false;
    }

    @Override
    public void reconnectingIn(int arg0) {

        Log.d("xmpp", "Reconnectingin " + arg0);

        loggedin = false;
    }

    @Override
    public void reconnectionFailed(Exception arg0) {
        if (isToasted)

            new Handler(Looper.getMainLooper()).post(new Runnable() {

                @Override
                public void run() {

                    Toast.makeText(context, "ReconnectionFailed!",
                            Toast.LENGTH_SHORT).show();

                }
            });
        Log.d("xmpp", "ReconnectionFailed!");
        connected = false;

        chat_created = false;
        loggedin = false;
    }

    @Override
    public void reconnectionSuccessful() {
        if (isToasted)

            new Handler(Looper.getMainLooper()).post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                    Toast.makeText(context, "REConnected!",
                            Toast.LENGTH_SHORT).show();

                }
            });
        Log.d("xmpp", "ReconnectionSuccessful");
        connected = true;

        chat_created = false;
        loggedin = false;
    }

    @Override
    public void authenticated(XMPPConnection arg0, boolean arg1) {
        Log.d("xmpp", "Authenticated!");
        loggedin = true;

        ChatManager.getInstanceFor(connection).addChatListener(
                mChatManagerListener);

        chat_created = false;
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }).start();
        if (isToasted)

            new Handler(Looper.getMainLooper()).post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                    Toast.makeText(context, "Connected!",
                            Toast.LENGTH_SHORT).show();

                }
            });
    }
}

private class MMessageListener implements ChatMessageListener {

    public MMessageListener(Context contxt) {
    }

    @Override
    public void processMessage(final org.jivesoftware.smack.chat.Chat chat,
                               final Message message) {
        Log.i("MyXMPP_MESSAGE_LISTENER", "Xmpp message received: '"
                + message);

        if (message.getType() == Message.Type.chat
                && message.getBody() != null) {
            final ChatMessage chatMessage = gson.fromJson(
                    message.getBody(), ChatMessage.class);

            processMessage(chatMessage);
        }
    }

    private void processMessage(final ChatMessage chatMessage) {

        chatMessage.isMine = false;
        Chats.chatlist.add(chatMessage);
        new Handler(Looper.getMainLooper()).post(new Runnable() {

            @Override
            public void run() {
                Chats.chatAdapter.notifyDataSetChanged();

            }
        });
    }

}

}


如果您需要连接的代码,请告诉我,我会一并发布。提前致谢! - Allen Daniel
提供连接代码。 - Sunil Singh
我添加了连接代码 @SunilSingh - Allen Daniel
@AllenDaniel,有找到任何解决方案吗?我也遇到了类似的问题。 - arslan haktic
1个回答

0

尝试这段代码

 public void initConnection(String user, String pass) throws XMPPException {
        // TODO Auto-generated method stub





        String SERVER_HOST = "192.168.1.199";
        int SERVER_PORT = 5222;
        String SERVICE_NAME = "Allen";
        try {
            if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                        .permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }

            XMPPTCPConnectionConfiguration.Builder connConfig = XMPPTCPConnectionConfiguration
                    .builder();
            connConfig
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
            connConfig.setUsernameAndPassword(user, pass);
            connConfig.setServiceName(SERVICE_NAME);
            connConfig.setHost(SERVER_HOST);
            connConfig.setPort(SERVER_PORT).setCompressionEnabled(false);
            connConfig.setDebuggerEnabled(true);
            connConfig.setConnectTimeout(25000);
            XMPPTCPConnectionConfiguration configuration = connConfig.build();
            //  XMPPTCPConnection.setUseStreamManagementDefault(true);
            // XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
            // XMPPTCPConnection.setReplyToUnknownIqDefault(true);

            connection = new XMPPTCPConnection(configuration);
            connection.setUseStreamManagement(true);
            connection.setUseStreamManagementResumption(true);
            connection.setReplyToUnknownIq(true);
            connection.setPacketReplyTimeout(25000);
            ReconnectionManager manager = ReconnectionManager.getInstanceFor(connection);
            manager.setFixedDelay(15);
            ReconnectionManager.setDefaultReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.FIXED_DELAY);
            manager.enableAutomaticReconnection();
            try {
                connection.connect();
                connection.login();


                //logIn();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

同样的错误,Sunil Singh。你做了什么更改? - Allen Daniel
禁用流管理并检查服务器端流管理是否已启用? - Sunil Singh
提供ejabberd服务器配置。 - Sunil Singh
我已经上传了ejabberd配置,请检查。谢谢。 - Allen Daniel
@AllenDaniel 在你的项目中添加这个连接和登录代码,如果登录成功,则添加你的监听器。这是经过测试的可行代码。 - Sunil Singh
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接