【问题标题】:Push message in Android在 Android 中推送消息
【发布时间】:2010-11-09 09:59:24
【问题描述】:

我已经管理了从谷歌获取身份验证令牌,现在我正在尝试将消息推送到我的 android 设备。

//code to fetch auth Token
<?php

$url = "https://www.google.com/accounts/ClientLogin";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
echo $url;
$post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE'). "&Email=" . urlencode('mail@gmail.com'). "&Passwd=" . urlencode('xxx'). "&service=" . urlencode('ac2dm');
echo $post_fields; echo "<br/>";
$data = array('accountType' => 'GOOGLE', 'Email' => 'mail@gmail.com', 'Passwd' => 'xxx', 'source'=>'PHI-cUrl-Example', 'service'=>'ac2dm');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT)); //for debugging the request
$response = curl_exec($ch);
var_dump($response);
curl_close($ch);
echo "<br/><br/>";
?>

我从谷歌获得了 AuthToken。现在我需要将我的消息发送到 android 设备 这是那个的 php 代码...

(second.php)

<?php
$wannasay = array (
"registration_id" => "APA91bH9SYn9Iru4Ddr87neqEh3OWaUhT8k_UUpxUZj7ORMLwFCiZ3qKm1yKWGFro47DNsk6CynvureInynXFqs1zEZ9xUwUlw",
"collapse_key" => "abcdef"
);
$dataels = array();
foreach (array_keys($wannasay) as $thiskey) {
array_push($dataels,urlencode($thiskey) ."=".
urlencode($wannasay[$thiskey]));
}
$data = implode("&",$dataels);

// work out the request
//auth token below is the one i got from above script


$authToken="DQAAAK0AAAABGiOYfUQfp_ZiDyZqErKOacSmgZCFvnogDUaVzSX9a6qh079XJblM63Z12JwOdRv8gDNCqLj80olSbFeqZFJpqXQDvmmW_PcyHUZPyDZIpZ0G0FRkV_sgqy06YM7r5zUnAggHA8hlmVM3AQBYNGcP_A2Ddq_pjm6cqaQBQH_dFaJgK6UfxNaNDK2jl78VWSU-ZMb-Q2zU1xMLbwYcWXuYIRqRxSlEN68N2M2u4Ub_AA";
$header =
"POST http://android.apis.google.com/c2dm/send HTTP/1.1\n" .
"Host: yourhost\n" .
"Content-Type: application/x-www-form-urlencoded\n" .
"Authorization: GoogleLogin auth=" . $authToken . "\n" .
"Content-Length: " . strlen($data) . "\n\n" .
$data . "\n";


// establish the connection and send the request

$s = socket_create(AF_INET, SOCK_DGRAM, 0);//AF_INET ipv4 internet based protocol
$z = socket_connect($s, gethostbyname("yourhost"), 80);
socket_write ($s, $header, strlen($header));

$header = "";

while (true) {   
if (strlen($c = socket_read($s, 1))) {  //this is line 20
$header .= $c; 
}
}

socket_close($s);
print nl2br(htmlspecialchars($header));

?> 

我正在从 localhost 运行这两个代码。我想我在这里遇到套接字问题。要么页面一直加载,要么我给了我致命错误:第 20 行左右的最大时间超过 60 秒。

当我在服务器上尝试代码时,我得到了错误

Warning: socket_read() [function.socket-read]: unable to read from socket [111]: Connection refused in second.php on line 20

我不知道这里有什么问题。有人可以告诉我为什么会出现此错误。我不知道套接字是如何在 Android 上工作的。

【问题讨论】:

  • 请注意,您可以 format lines as code 将它们缩进四个空格。编辑器工具栏中的“{}”按钮会为您执行此操作。编辑您的问题并尝试一下。单击编辑器工具栏中的橙色问号以获取有关格式设置的更多信息和提示。

标签: php android sockets push message


【解决方案1】:

你说你在本地主机上运行它(我假设你的意思是在电脑上而不是手机上)

如果您正在运行模拟器,它实际上有自己的 IP,因此 localhost 指向您的模拟器,而不是您的计算机。您必须使用计算机的 IP 地址(如果您在路由器后面,通常为 192.168.x.x)。

如果您在手机上运行,​​您还必须使用计算机的 IP 地址,但您必须使用外部 IP,而不是路由器后面的 IP(手机不在本地网络上) .

话虽如此,我注意到你有这条线(没有数字,但它接近尾声)

socket_connect($s, gethostbyname("yourhost"), 80);

我猜"yourhost" 你的意思是“本地主机”,你的意思是你的计算机的 IP 地址 :)

实际上,我注意到您曾多次使用“yourhost",这仅仅是从教程或文档页面复制的错误吗?

【讨论】:

  • 那么,我将使用IP。我会试试这个。顺便说一句,我自己写了你的主机,因为我也在同时尝试我的主机。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
相关资源
最近更新 更多