- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
自从过去四天以来,我一直在尝试使用自己的 XMPP 和 Smack+OpenFire 发送和接收聊天消息。根据 Smack 的“readme.txt”,我设置了连接并让用户登录。连接和登录的代码是这样的
public static String TAG = "Test connection";
private static XMPPTCPConnection connection;
private static String userName = "demo";
private static String Password = "demo";
static {
// Create the configuration for this new connection
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.disabled);
configBuilder.setResource("");
configBuilder.setUsernameAndPassword(userName, Password);
configBuilder.setServiceName("192.168.2.10");
configBuilder.setHost("192.168.2.10");
configBuilder.setPort(5222);
configBuilder.setCompressionEnabled(false);
connection = new XMPPTCPConnection(configBuilder.build());
}
这样我就配置了 connectionbuilder。我在这里连接并登录用户。
public class ConnectAndLogin extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
connection.connect();
Log.i(TAG, "Connected to " + connection.getHost());
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XMPPException e) {
Log.e(TAG, "Failed to connect to " + connection.getHost());
Log.e(TAG, e.toString());
e.printStackTrace();
}
try {
connection.login(userName, Password);
Log.i(TAG, "Login as a : " + connection.getUser());
setConnection(connection);
setListner();
} catch (XMPPException e) {
e.printStackTrace();
Log.i(TAG, "Login error " + e.toString());
} catch (SmackException e) {
e.printStackTrace();
Log.i(TAG, "Login error " + e.toString());
} catch (IOException e) {
e.printStackTrace();
Log.i(TAG, "Login error " + e.toString());
}
return null;
}
}
在某些教程中,必须在登录后设置addPacketListner
。我在 setConnection()
中完成了此操作,一些帖子通过了 addAsyncStanzaListner
。用于发送消息
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message msg = new Message("demo2", Message.Type.chat);
msg.setBody("Hi how are you");
if (connection != null) {
try {
connection.sendPacket(msg);
Log.d("Send to room : Name : ", "demo2");
Log.d("store", "store data to db");
//DBAdapter.addUserData(new UserData(text, "", "1" ,beam_id));
} catch (Exception e) {
Log.d("ooo", "msg exception" + e.getMessage());
}
}
}
});
以及用于接收消息此代码
public void setListner() {
connection.addAsyncStanzaListener(new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
Message message = (Message) packet;
Log.i(TAG, "REC : " + message.getBody());
Log.i(TAG, "REC: " + message.getFrom());
}
}, new StanzaFilter() {
@Override
public boolean accept(Stanza stanza) {
return false;
}
});
}
这是我的依赖
compile 'org.igniterealtime.smack:smack-android:4.1.0'
compile 'org.igniterealtime.smack:smack-tcp:4.1.0'
compile 'org.igniterealtime.smack:smack-core:4.1.0'
compile 'org.igniterealtime.smack:smack-im:4.1.0'
compile 'org.igniterealtime.smack:smack-resolver-minidns:4.1.0'
compile 'org.igniterealtime.smack:smack-sasl-provided:4.1.0'
但我仍然无法向 demo2 用户发送消息。我哪里做错了。请指导和帮助我。谢谢
最佳答案
很长一段时间后,我现在可以发送短信甚至图像了。这是我处理 XmppConnection 的完整代码。
public class SmackConnection implements ConnectionListener, ChatManagerListener, RosterListener, ChatMessageListener, PingFailedListener {
private Gson gson;
private AsyncTask<Void, Void, Void> mRegisterTask;
private FileTransferManager manager;
private static final String TAG = "SMACK";
public static Context mApplicationContext;
public static SmackConnection instance = null;
private final String mServiceName = "192.168.2.3";
private static XMPPTCPConnection mConnection;
private static final byte[] dataToSend = StringUtils.randomString(1024 * 4 * 3).getBytes();
private static byte[] dataReceived;
private XMPPTCPConnectionConfiguration.Builder config;
public void init(String mUsername, String mPassword) {
Log.i(TAG, "connect()");
config = XMPPTCPConnectionConfiguration.builder();
config.setServiceName(mServiceName);
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setHost(mServiceName);
config.setPort(5222);
config.setDebuggerEnabled(true);
config.setResource("sender");
config.setCompressionEnabled(true);
config.setUsernameAndPassword(mUsername, mPassword);
XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
XMPPTCPConnection.setUseStreamManagementDefault(true);
config.setCompressionEnabled(true);
try {
TLSUtils.acceptAllCertificates(config);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
mConnection = new XMPPTCPConnection(config.build());
mConnection.addConnectionListener(this);
PingManager pingManager = PingManager.getInstanceFor(mConnection);
pingManager.registerPingFailedListener(this);
ChatManager.getInstanceFor(mConnection).addChatListener(this);
manager = FileTransferManager.getInstanceFor(mConnection);
manager.addFileTransferListener(new FileTransferIMPL());
FileTransferNegotiator.getInstanceFor(mConnection);
gson = new Gson();
connectAndLoginAnonymously();
}
public void connectAndLoginAnonymously() {
mRegisterTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
mConnection.connect();
mConnection.login();
} catch (SmackException | XMPPException | IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void res) {
}
};
// execute AsyncTask
mRegisterTask.execute(null, null, null);
}
public void login(final String username, final String password) {
mRegisterTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
disconnect();
config.setUsernameAndPassword(username, password);
mConnection.connect();
mConnection.login();
} catch (SmackException | XMPPException | IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void res) {
}
};
// execute AsyncTask
mRegisterTask.execute(null, null, null);
}
public void disconnect() {
Log.i(TAG, "disconnect()");
if (mConnection != null) {
mConnection.disconnect();
}
}
public void sendMessage(ChatMessage chatMessage) {
gson = new Gson();
Log.i(TAG, "sendMessage()");
Chat chat = ChatManager.getInstanceFor(mConnection).createChat(chatMessage.receiver + "@santosh-pc", this);
Gson gson = new Gson();
String body = gson.toJson(chatMessage);
final Message message = new Message();
message.setBody(body);
message.setStanzaId(chatMessage.msgid);
message.setType(Message.Type.chat);
try {
chat.sendMessage(message);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
@Override
public void chatCreated(Chat chat, boolean createdLocally) {
Log.i(TAG, "chatCreated()");
chat.addMessageListener(this);
}
//MessageListener
@Override
public void processMessage(Chat chat, Message message) {
gson = new Gson();
Log.i(TAG, "processMessage()");
if (message.getType().equals(Message.Type.chat) || message.getType().equals(Message.Type.normal)) {
Log.i("MyXMPP_MESSAGE_LISTENER", "Xmpp message received: '"
+ message);
if (message.getType() == Message.Type.chat
&& message.getBody() != null) {
String sender1 = message.getFrom();
final Random random = new Random();
final String delimiter = "\\@";
String[] temp = sender1.split(delimiter);
final String sender = temp[0];
final ChatMessage chatMessage = gson.fromJson(message.getBody(), ChatMessage.class);
chatMessage.msgid = " " + random.nextInt(1000);
processMessage(sender, chatMessage);
}
}
}
public void processMessage(final String sender, ChatMessage chatMessage) {
chatMessage.sender = sender;
chatMessage.receiver = LoginSignupPage.self;
chatMessage.type = "TEXT";
chatMessage.isMine = false;
Log.i("MSG RECE", chatMessage.getBody());
ChatActivity.chatlist.add(chatMessage);
CommonMethods commonMethods = new CommonMethods(mApplicationContext);
commonMethods.createTable(sender);
commonMethods.insertIntoTable(sender, sender, LoginSignupPage.self, "fdfd", "r", "TEXT");
Log.i("MSG RECE", "Added");
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Log.i("MSG RECE", "LOOPER");
ChatActivity.chatAdapter.notifyDataSetChanged();
}
});
}
private void processMessage(final FileTransferRequest request) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Log.i("MSG RECE", "LOOPER");
Random random = new Random();
CommonMethods commonMethods = new CommonMethods(mApplicationContext);
int iend = request.getRequestor().lastIndexOf("@");
String requester = request.getRequestor().substring(0, 10);
commonMethods.createTable(requester);
Log.i("MSG RECE", requester);
commonMethods.insertIntoTable(requester, requester, LoginSignupPage.self, request.getFileName(), "r", "IMG");
final ChatMessage chatMessage = new ChatMessage(LoginSignupPage.self, requester,
request.getFileName(), "" + random.nextInt(1000), false, "IMG");
chatMessage.setMsgID();
chatMessage.body = request.getFileName();
chatMessage.Date = CommonMethods.getCurrentDate();
chatMessage.Time = CommonMethods.getCurrentTime();
chatMessage.type = "IMG";
ChatActivity.chatlist.add(chatMessage);
ChatActivity.chatAdapter.notifyDataSetChanged();
Log.i("MSG RECE", request.getRequestor());
}
});
}
//ConnectionListener
@Override
public void connected(XMPPConnection connection) {
Log.i(TAG, "connected()");
}
@Override
public void authenticated(XMPPConnection connection, boolean arg0) {
Log.i(TAG, "authenticated()");
}
@Override
public void connectionClosed() {
Log.i(TAG, "connectionClosed()");
}
@Override
public void connectionClosedOnError(Exception e) {
Log.i(TAG, "connectionClosedOnError()");
}
@Override
public void reconnectingIn(int seconds) {
Log.i(TAG, "reconnectingIn()");
}
@Override
public void reconnectionSuccessful() {
Log.i(TAG, "reconnectionSuccessful()");
}
@Override
public void reconnectionFailed(Exception e) {
Log.i(TAG, "reconnectionFailed()");
}
//RosterListener
@Override
public void entriesAdded(Collection<String> addresses) {
}
@Override
public void entriesUpdated(Collection<String> addresses) {
Log.i(TAG, "entriesUpdated()");
}
@Override
public void entriesDeleted(Collection<String> addresses) {
Log.i(TAG, "entriesDeleted()");
}
@Override
public void presenceChanged(Presence presence) {
Log.i(TAG, "presenceChanged()");
}
@Override
public void pingFailed() {
Log.i(TAG, "pingFailed()");
}
public boolean createNewAccount(String username, String newpassword) {
boolean status = false;
if (mConnection == null) {
try {
mConnection.connect();
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
}
}
try {
String newusername = username + mConnection.getServiceName();
Log.i("service", mConnection.getServiceName());
AccountManager accountManager = AccountManager.getInstance(mConnection);
accountManager.createAccount(username, newpassword);
status = true;
} catch (SmackException.NoResponseException e) {
status = false;
e.printStackTrace();
} catch (XMPPException.XMPPErrorException e) {
e.printStackTrace();
status = false;
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
status = false;
}
mConnection.disconnect();
return status;
}
public XMPPTCPConnection getConnection() {
return mConnection;
}
public SmackConnection(Context context) {
mApplicationContext = context;
}
public SmackConnection() {
}
public XMPPTCPConnection SmackConnection() {
return mConnection;
}
public static SmackConnection getInstance(Context context) {
if (instance == null) {
instance = new SmackConnection(context);
mApplicationContext = context;
}
return instance;
}
public class FileTransferIMPL implements FileTransferListener {
@Override
public void fileTransferRequest(final FileTransferRequest request) {
final IncomingFileTransfer transfer = request.accept();
try {
InputStream is = transfer.recieveFile();
ByteArrayOutputStream os = new ByteArrayOutputStream();
int nRead;
byte[] buf = new byte[1024];
try {
while ((nRead = is.read(buf, 0, buf.length)) != -1) {
os.write(buf, 0, nRead);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
dataReceived = os.toByteArray();
createDirectoryAndSaveFile(dataReceived, request.getFileName());
Log.i("File Received", transfer.getFileName());
processMessage(request);
} catch (XMPPException ex) {
Logger.getLogger(SmackConnection.class.getName()).log(Level.SEVERE, null, ex);
} catch (SmackException e) {
e.printStackTrace();
}
}
}
public void fileTransfer(String user, Bitmap bitmap, String filename) throws XMPPException {
Roster roster = Roster.getInstanceFor(mConnection);
String destination = roster.getPresence(user).getFrom();
// Create the file transfer manager
FileTransferManager manager = FileTransferManager.getInstanceFor(mConnection);
// Create the outgoing file transfer
final OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(destination);
// Send the file
//transfer.sendFile(new File("abc.txt"), "You won't believe this!");
transfer.sendStream(new ByteArrayInputStream(convertFileToByte(bitmap)), filename, convertFileToByte(bitmap).length, "A greeting");
System.out.println("Status :: " + transfer.getStatus() + " Error :: " + transfer.getError() + " Exception :: " + transfer.getException());
System.out.println("Is it done? " + transfer.isDone());
if (transfer.getStatus().equals(FileTransfer.Status.refused))
System.out.println("refused " + transfer.getError());
else if (transfer.getStatus().equals(FileTransfer.Status.error))
System.out.println(" error " + transfer.getError());
else if (transfer.getStatus().equals(FileTransfer.Status.cancelled))
System.out.println(" cancelled " + transfer.getError());
else
System.out.println("Success");
}
public byte[] convertFileToByte(Bitmap bmp) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
return stream.toByteArray();
}
private void createDirectoryAndSaveFile(byte[] imageToSave, String fileName) {
File direct = new File(Environment.getExternalStorageDirectory() + "/LocShopie/Received/");
if (!direct.exists()) {
File wallpaperDirectory = new File("/sdcard/LocShopie/Received/");
wallpaperDirectory.mkdirs();
}
File file = new File(new File("/sdcard/LocShopie/Received/"), fileName);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
out.write(imageToSave);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/*DeliveryReceiptManager dm = DeliveryReceiptManager
.getInstanceFor(mConnection);
dm.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
dm.addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(final String fromid,
final String toid, final String msgid,
final Stanza packet) {
}
});*/
}
其中一些行是数据库的,因为我将文本消息存储在 sqlite 中。此方法用于发送消息。
public void sendTextMessage(View v) {
String message = msg_edittext.getEditableText().toString();
if (!message.equalsIgnoreCase("")) {
final ChatMessage chatMessage = new ChatMessage(LoginSignupPage.self, user2, message, "" + random.nextInt(1000), true, "TEXT");
chatMessage.setMsgID();
chatMessage.body = message;
chatMessage.Date = CommonMethods.getCurrentDate();
chatMessage.Time = CommonMethods.getCurrentTime();
chatMessage.type = "TEXT";
chatMessage.isMine = true;
msg_edittext.setText("");
try {
chatAdapter.add(chatMessage);
chatAdapter.notifyDataSetChanged();
chatXmpp.sendMessage(chatMessage);
} catch (Exception e) {
e.printStackTrace();
}
CommonMethods commonMethods = new CommonMethods(ChatActivity.this);
commonMethods.createTable(user2);
commonMethods.insertIntoTable(user2, chatMessage.sender, chatMessage.receiver, chatMessage.body, "m", "TEXT");
}
}
关于android - 使用 Smack Api for Android 发送和接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551229/
我一直在读到,如果一个集合“被释放”,它也会释放它的所有对象。另一方面,我还读到,一旦集合被释放,集合就会释放它的对象。 但最后一件事可能并不总是发生,正如苹果所说。系统决定是否取消分配。在大多数情况
我有一个客户端-服务器应用程序,它使用 WCF 进行通信,并使用 NetDataContractSerializer 序列化对象图。 由于服务器和客户端之间传输了大量数据,因此我尝试通过微调数据成员的
我需要有关 JMS 队列和消息处理的帮助。 我有一个场景,需要针对特定属性组同步处理消息,但可以在不同属性组之间同时处理消息。 我了解了特定于每个属性的消息组和队列的一些知识。我的想法是,我想针对
我最近开始使用 C++,并且有一种强烈的冲动 #define print(msg) std::cout void print(T const& msg) { std::cout void
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
这个问题在这里已经有了答案: Firebase messaging is not supported in your browser how to solve this? (3 个回答) 7 个月前关
在我的 C# 控制台应用程序中,我正在尝试更新 CRM 2016 中的帐户。IsFaulted 不断返回 true。当我向下钻取时它返回的错误消息如下: EntityState must be set
我正在尝试通过 tcp 将以下 json 写入 graylog 服务器: {"facility":"GELF","file":"","full_message":"Test Message Tcp",
我正在使用 Django 的消息框架来指示成功的操作和失败的操作。 如何排除帐户登录和注销消息?目前,登录后登陆页面显示 已成功登录为“用户名”。我不希望显示此消息,但应显示所有其他成功消息。我的尝试
我通过编写禁用qDebug()消息 CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 在.pro文件中。这很好。我想知道是否可以
我正在使用 ThrottleRequest 来限制登录尝试。 在 Kendler.php 我有 'throttle' => \Illuminate\Routing\Middleware\Throttl
我有一个脚本,它通过die引发异常。捕获异常时,我想输出不附加位置信息的消息。 该脚本: #! /usr/bin/perl -w use strict; eval { die "My erro
允许的消息类型有哪些(字符串、字节、整数等)? 消息的最大大小是多少? 队列和交换器的最大数量是多少? 最佳答案 理论上任何东西都可以作为消息存储/发送。实际上您不想在队列上存储任何内容。如果队列大部
基本上,我正在尝试创建一个简单的 GUI 来与 Robocopy 一起使用。我正在使用进程打开 Robocopy 并将输出重定向到文本框,如下所示: With MyProcess.StartI
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
我得到了一个带有 single_selection 数据表和一个命令按钮的页面。命令按钮调用一个 bean 方法来验证是否进行了选择。如果不是,它应该显示一条消息警告用户。如果进行了选择,它将导航到另
我知道 MSVC 可以通过 pragma 消息做到这一点 -> http://support.microsoft.com/kb/155196 gcc 是否有办法打印用户创建的警告或消息? (我找不到谷
当存在大量节点或二进制数据时, native Erlang 消息能否提供合理的性能? 情况 1:有一个大约 50-200 台机器的动态池(erlang 节点)。它在不断变化,每 10 分钟大约添加或删
我想知道如何在用户登录后显示“欢迎用户,您已登录”的问候消息,并且该消息应在 5 秒内消失。 该消息将在用户成功登录后显示一次,但在同一 session 期间连续访问主页时不会再次显示。因为我在 ho
如果我仅使用Welcome消息,我的代码可以正常工作,但是当打印p->client_name指针时,消息不居中。 所以我的问题是如何将消息和客户端名称居中,就像它是一条消息一样。为什么它目前仅将消
我是一名优秀的程序员,十分优秀!