我正在开发一款依赖于LAMP服务器的iPhone游戏。我想创建一个基于“事件”的系统,其中apache服务器向iphone发送一个事件。
为此,我正在考虑使用“CFStreamCreatePairWithSocketToHost”连接到apache服务器的端口80。
我能够成功连接到服务器并通过iPhone打开读写流,但我不知道如何使用从LAMP服务器运行到iPhone的PHP将数据发送到iphone。
我想我可以在php中使用fsockopen打开套接字连接并将数据写入该套接字。我累了运行这段代码
$fp = fsockopen("tcp://localhost", 80, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
回显“写入插座
”;
fwrite($ fp,“wwqeqweqw eqwe qwe \ n”);
//echo fread($fp, 26);
fclose($fp);
echo "done";
}
但是,我没有在iPhone上看到任何内容。任何想法发生了什么,或者如何实现这一目标?
谢谢!
答案 0 :(得分:1)
嗯,使用PHP来监听传入的连接是次优的,它并不是它真正构建的。是否无法使用“普通”基于HTTP的通信通道,对URL进行简单请求并以您喜欢的任何格式解析返回的数据?
无论如何,请查看
答案 1 :(得分:1)
HTTP实际上不是流协议,您发送请求并从中获取响应。您可能希望查看除apache / php之外的其他内容以满足此要求
...或者注意Pekka的建议并将您的要求分解为简单的请求响应。即定期轮询你的服务器以查看是否有任何数据等待iphone处理...注意我并不是在提倡这一点,因为它在网络或程序员身上不是很愉快,但它是可能的。
另一种方法是构建自己的服务(不要使用apache),它将接受你的iphone可以连接到的特定端口上的连接,并以这种方式进行通信 - 如果你愿意,你甚至可以用这种方式运行PHP脚本(但请阅读Pekka提供的链接。)
另一种方法是将服务器构建到您的网络服务器可以连接的iphone应用程序中 - 但是这有点傻,因为您的服务器可能比您的iPhone更多在线(因为iPhone的应用程序不在后台运行)如果它没有被越狱,iphone 4.0还没有向公众发布。)
选项非凡:)
马特
答案 2 :(得分:0)
使用'pull'代替'push'模型......
浏览器通常设计为无状态。有很多方法可以解决这个限制,但不能做你正在描述的事情。
因为服务器从不期望将数据“推送”到客户端。这意味着服务器必须意识到将数据传输到客户端的存在,位置和介质,而这通常不是。
而不是试图让服务器将事件推送到iPhone上的客户端。让服务器存储状态并让iPhone经常使用AJAX轮询应用程序状态。
如果你想在服务器和客户端之间建立直接1-1连接的应用程序LAMP / PHP是错误的方法,因为你需要在服务器和iPhone上运行LAMP才能完成你的工作描述。 IE,您不能将数据从HTTP服务器“推送”到HTTP客户端,只能将服务器请求的数据返回给客户端。