diff --git a/client/src/main/java/cn/wildfirechat/client/IMClient.java b/client/src/main/java/cn/wildfirechat/client/IMClient.java index acffa24b..24b2f6c1 100644 --- a/client/src/main/java/cn/wildfirechat/client/IMClient.java +++ b/client/src/main/java/cn/wildfirechat/client/IMClient.java @@ -1,5 +1,6 @@ package cn.wildfirechat.client; +import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; @@ -18,6 +19,7 @@ import org.fusesource.mqtt.client.*; import java.io.*; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Base64; import java.util.List; @@ -280,15 +282,38 @@ public class IMClient implements Listener { try { WFCMessage.NotifyMessage notifyMessage = WFCMessage.NotifyMessage.parseFrom(body.toByteArray()); WFCMessage.PullMessageRequest request = WFCMessage.PullMessageRequest.newBuilder().setId(messageHead).setType(notifyMessage.getType()).build(); - connection.publish("MP", request.toByteArray(), QoS.AT_LEAST_ONCE, false, new Callback(){ + byte[] data = request.toByteArray(); + data = AES.AESEncrypt(data, privateSecret); + connection.publish("MP", data, QoS.AT_LEAST_ONCE, false, new Callback(){ @Override public void onSuccess(byte[] value) { + if (value == null || value.length == 0) { + System.out.println("Invalide data"); + } + + if (value[0] != 0) { + System.out.println("Pull message error with errorCode:" + value[0]); + } + + byte[] data = new byte[value.length - 1]; + for (int i = 0; i < data.length; i++) { + data[i] = value[i+1]; + } + try { - byte[] data = AES.AESDecrypt(value, privateSecret, true); + data = AES.AESDecrypt(data, privateSecret, true); try { WFCMessage.PullMessageResult result = WFCMessage.PullMessageResult.parseFrom(data); - if (receiveMessageCallback != null) { - receiveMessageCallback.onReceiveMessages(result.getMessageList(), false); + if (receiveMessageCallback != null && result.getMessageList().size() > 0) { + List messages = result.getMessageList(); + List out = new ArrayList<>(); + for (WFCMessage.Message msg : messages) { + if (msg.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private && msg.getConversation().getTarget().equals(userId)) { + msg = msg.toBuilder().setConversation(msg.getConversation().toBuilder().setTarget(msg.getFromUser())).build(); + } + out.add(msg); + } + receiveMessageCallback.onReceiveMessages(out, false); } messageHead = result.getHead(); } catch (InvalidProtocolBufferException e) { @@ -355,23 +380,24 @@ public class IMClient implements Listener { public static void main(String[] args) { //token与userid和clientid是绑定的,使用时一定要传入正确的userid和clientid,不然会认为token非法 - IMClient client = new IMClient("yzyOyOKK", "7SJk13q+YdHHe6EwDzry9BKogxTNf3UgtYj50cBTZgWNkNuxEkiqg2koKg0lXViONIX1LmwCR1jN0Mw8hvk6KGpiSKFi+IRaRkIb3mNzgIfrq4afhyIHaQfa2HOfsi6Ws+9YobkdDgdq7W70bEdVfiCSU9+JOIY449nxZzfg2Zw=", "DD72C212-26C7-4B38-A5FC-88550896B170", "192.168.1.101", 80); + //clientId唯一代表一个设备,只能有一个登录。如果使用同一个clientId登录多次,会出现不可预料问题。 + IMClient client = new IMClient("KNK_K_00", "6I7UTfKSQT7VhsUJfU6UCvDeCyblLfcXPfajAFxgFGOcqvfFVQCvYy8A5vfAGUj2LSYgoM5W02MHh6jtG/otQs6ft8zLT4Efz315UlDLfrz+OSQYfwAuGFw9m0/x4ckrgiooprsKFxPMaNcCDact0qvp1dBhbeGUipdWVhI33b4=", "5B6DEB72-8A3D-45E2-A88A-47DC4E692B00", "192.168.0.193", 80); client.setReceiveMessageCallback(new ReceiveMessageCallback() { @Override public void onReceiveMessages(List messageList, boolean hasMore) { - + System.out.println("recieved messages"); } @Override public void onRecallMessage(long messageUid) { - + System.out.println("recalled messages"); } }); client.setConnectionStatusCallback((ConnectionStatus newStatus) -> { if (newStatus == ConnectionStatus_Connected) { - WFCMessage.Conversation conversation = WFCMessage.Conversation.newBuilder().setType(0).setTarget("yzyOyOKK").setLine(0).build(); + WFCMessage.Conversation conversation = WFCMessage.Conversation.newBuilder().setType(0).setTarget("IMININnn").setLine(0).build(); WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.newBuilder().setSearchableContent("helloworld").setType(1).build(); client.sendMessage(conversation, messageContent, new SendMessageCallback() { @Override