Tôi muốn phát triển một ứng dụng nhắn tin tức thời. GCM, để đẩy dữ liệu là một cách phổ biến (và hiệu quả), nếu bạn đang sử dụng android, nhưng tôi không sử dụng nó vì các lý do sau:Cách sử dụng XMPP liên tục hiệu quả với android
- Nó xóa hơn 100 tin nhắn chưa được gửi.
- Nó sẽ không hoạt động trên các thiết bị không có ứng dụng google.
Thay vào đó, tôi quyết định thiết lập máy chủ XMPP truyền thống (openFire) và tôi đang sử dụng Smack api (kết nối TCP) để kết nối. Cho đến nay, nó đang diễn ra tốt đẹp, nhưng tôi có một vài lo ngại.
Đây là một mã thử nghiệm nhỏ tôi đã viết (nó chạy trong một dịch vụ):
Log.d("TAG","service has started");
SmackConfiguration.setDefaultPacketReplyTimeout(10000);
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword("admin", "football100")
.setServiceName("harsh-pc")
.setHost("192.168.0.200")
.setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.build();
final AbstractXMPPConnection conn2 = new XMPPTCPConnection(config);
try {
conn2.connect();
conn2.login();
Presence presence = new Presence(Presence.Type.available);
presence.setStatus("online");
// Send the packet (assume we have an XMPPConnection instance called "con").
conn2.sendStanza(presence);
} catch (SmackException | IOException | XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("TAG", e.toString());
}
StanzaFilter filter=new StanzaFilter() {
@Override
public boolean accept(Stanza stanza) {
return true;
}
};
StanzaListener listener= new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
Log.d("TAG","recevied stuff");
ChatManager chatmanager = ChatManager.getInstanceFor(conn2);
Chat newChat = chatmanager.createChat("[email protected]");
newChat.sendMessage("Reply :) ");
}
};
conn2.addAsyncStanzaListener(listener,filter);
ChatManager chatmanager = ChatManager.getInstanceFor(conn2);
Chat newChat = chatmanager.createChat("[email protected]");
try {
Random r=new Random();
// newChat.sendMessage(Integer.toString(r.nextInt()));
Thread.sleep(1500);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("TAG",e.toString());
}
}
}).start();
final Thread sleeper=new Thread(new Runnable() {
@Override
public void run() {
for(;;){
try {
Thread.sleep(100000);
Log.d("TAG","SLEEPI");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});sleeper.start();
Chú ý phần cuối của đoạn này. Tôi phải chạy một vòng lặp vô hạn để tôi có thể tiếp tục nghe các gói tin đến (nếu tôi không bao gồm mã này, tôi không thể chặn bất kỳ gói dữ liệu gửi đến nào).
Câu hỏi của tôi là:
- là phương pháp này sẽ mất một lượng lớn pin?
- Phương pháp này có ngăn thiết bị ngủ không?
- Có cách nào tốt hơn để hoàn thành công việc (không sử dụng GCM) không?
- Có cách nào để tích hợp GCM với OPENFIRE không?
của bạn khi tôi nói 'tích hợp' với Openfire , ý của tôi là vậy : nếu ứng dụng không mở và tin nhắn đến, openfire sẽ gửi tin nhắn thông qua GCM. Nếu ứng dụng được khởi động, sau đó kết nối socket sẽ được thiết lập và nó sẽ nói trực tiếp với máy chủ xmpp –
Tôi nghĩ bạn đang tìm kiếm trình cắm thêm servlet tùy chỉnh trong Openfire, tham khảo liên kết này 1. https: // community. igniterealtime.org/thread/50919 2. https://community.igniterealtime.org/thread/47895 – Dev
lưu ý ở đây Tôi chưa bao giờ sử dụng trình cắm thêm như vậy bản thân mình instate tôi đã sử dụng tính năng Tin nhắn Ngoại tuyến của XMPP http: // xmpp .org/extensions/xep-0160.html, Sử dụng tính năng triển khai này nếu openfire phát hiện người dùng đang nhận là Offline nó lưu trữ tin nhắn và cung cấp tất cả các tin nhắn ngoại tuyến ngay sau khi nhận được người dùng trực tuyến và gửi sự hiện diện [online/available]. – Dev