2015-11-03 99 views
3

我有服务器配置为Android的客户说:PubNub Server不格式化消息正确

<?php 

require_once("mysql.class.php"); 
require_once("lib/autoloader.php"); 


// Setting up the PubNub Server: 
use Pubnub\Pubnub; 

$pubnub = new Pubnub(
    "pub-c...", ## PUBLISH_KEY 
    "sub-c..." ## SUBSCRIBE_KEY 
); 


// Publishing : 
$post_data = json_encode(array("type"=> "groupMessage", "data" => array("chatUser" => "SERVER", "chatMsg" => "Now lets talk", "chatTime"=>1446514201516))); 
$info = $pubnub->publish('MainChat', $post_data); 

print_r($info); 
print_r($post_data); 

?> 

和HTML:

<!doctype html> 
<html> 
<head> 
    <title>PubNub PHP Test Page</title> 
</head> 
    <body> 
     <form method="POST" action="index.php"> 
      <input type="submit" name="submit" value="TestSendMessage" /> 
     </form> 
    </body> 
</html> 

的发布功能,服务器的工作,因为我可以查看消息到达客户端Android应用程序的日志控制台中,但消息从未解析正确,因此不会在给定SubscribeCallback的列表视图中显示:

public void subscribeWithPresence(String channel) { 
    this.channel = channel; 
    Callback subscribeCallback = new Callback() { 
     @Override 
     public void successCallback(String channel, Object message) { 
      if (message instanceof JSONObject) { 
       try { 
        JSONObject jsonObj = (JSONObject) message; 

        JSONObject json = jsonObj.getJSONObject("data"); 
        final String name = json.getString(Constants.JSON_USER); 
        final String msg = json.getString(Constants.JSON_MSG); 
        final long time = json.getLong(Constants.JSON_TIME); 
        if (name.equals(mPubNub.getUUID())) return; // Ignore own messages 
        final ChatMessage chatMsg = new ChatMessage(name, msg, time); 
        presentActivity.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          // Adding messages published to the channel 
          mChatAdapter.addMessage(chatMsg); 
         } 
        }); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      Log.d("PUBNUB", "Channel: " + channel + " Msg: " + message.toString()); 

     } 

     @Override 
     public void connectCallback(String channel, Object message) { 
      Log.d("Subscribe", "Connected! " + message.toString()); 
      //hereNow(false); 
      // setStateLogin(); 
     } 
    }; 
    try { 
     mPubNub.subscribe(this.channel, subscribeCallback); 
     //presenceSubscribe(); 
    } catch (PubnubException e) { 
     e.printStackTrace(); 
     // Checking if success 
     Log.d("Fail subscribe ", "on channel: " + channel); 
    } 
} 

点击TestSendMessage产量测试在浏览器中的服务器输出:

Array ([0] => 1 [1] => Sent [2] => 14465159776373950) {"type":"groupMessage","data":{"chatUser":"SERVER","chatMsg":"Now lets talk","chatTime":1446514201516}} 

,并在应用程序从行日志输出:Log.d("PUBNUB", "Channel: " + channel + " Msg: " + message.toString());

返回:D/PUBNUB: Channel: MainChat Msg: {"type":"groupMessage","data":{"chatUser":"SERVER","chatMsg":"Now lets talk","chatTime":1446514201516}}

,因为它应该,但消息从不出现在消息的ListView中,因此失败了JSON解析。

的JSON标签是从常量类也很简单:

public static final String JSON_GROUP = "groupMessage"; 
public static final String JSON_USER = "chatUser"; 
public static final String JSON_MSG = "chatMsg"; 
public static final String JSON_TIME = "chatTime"; 

如何可以在服务器发送进行重新配置,以便在应用程序解析成功?

+0

设备上的响应(消息)仍然只是一个字符串。我只需要将其转换为JSONObject jsonObj = new JSONObject(message)使其成为JSONObject的实例 – Sauron

回答

4

发送JSON在PubNub

Send the JSON object without stringifying it first。在PHP的情况下,请勿json_encode该消息。 PubNub SDK将为您编码和解码。

此:

$post_data = array("type"=> "groupMessage", "data" => array(
    "chatUser" => "SERVER", "chatMsg" => "Now lets talk", 
    "chatTime"=>1446514201516)); 

不是这个:

$post_data = json_encode(array("type"=> "groupMessage", "data" => array(
    "chatUser" => "SERVER", "chatMsg" => "Now lets talk", 
    "chatTime"=>1446514201516))); 

请评论这是否解决与否。