带有codeigniter和android的websocket

Posted

技术标签:

【中文标题】带有codeigniter和android的websocket【英文标题】:websocket with codeigniter and android 【发布时间】:2017-03-06 18:25:25 【问题描述】:

我有一个用 codeigniter php 开发的 web 应用程序和一个用于事件管理的 android 应用程序我想做的是,每当 web 上的管理员创建一个事件时,都应该生成一个通知并将其显示到 android 应用程序中,以便所有使用 android 应用程序的用户可以在没有任何中断的情况下接收该通知。

所以有人知道我如何实现这个功能吗? 我正在考虑使用网络套接字,但我在 codeigniter 和 android 中对此一无所知,因此任何类型的建议都会有所帮助。

【问题讨论】:

【参考方案1】:

我会使用以下组件:

ZeroMQ 用于传递消息http://zeromq.org 用于 web-socket 服务器的棘轮http://socketo.me 用于 web-socke 客户端的高速公路http://autobahn.ws/android/

我不知道您可以在 android 端使用什么来订阅网络服务服务器。

代码相当简单,这是我在项目中使用的示例。

网络套接字服务器:

composer.json


    "autoload": 
        "psr-0": 
            "MyApp": "src"
        
    ,
    "require": 
        "cboden/ratchet": "0.3.*",
        "react/zmq": "0.2.*|0.3.*"
    

push-server.php

<?php

require dirname(__DIR__) . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$pusher = new MyApp\Pusher;

// Listen for the web server to make a ZeroMQ push after an ajax request
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
// I assume the codeigniter installation and this server 
// will be on the same host, hence 127.0.0.1
$pull->bind('tcp://127.0.0.1:5555'); 
$pull->on('message', array($pusher, 'onMessage'));

// Set up our WebSocket server for clients wanting real-time updates
$webSock = new React\Socket\Server($loop);
$webSock->listen(8081, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\ioserver(
        new Ratchet\Http\HttpServer(
        new Ratchet\WebSocket\WsServer(
        new Ratchet\Wamp\WampServer(
        $pusher
        )
        )
        ), $webSock
);

$loop->run();

然后在codeigniter中你可以使用以下方式发送消息:

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'pusher');
$zmq_srv = 'your.domain.com:5555';
$socket->connect("tcp://" . $zmq_srv);

$messageContent = array(
    'user' => 'username',
    'type' => 'success',
    'message' => 'Hi this is a test message.',
);

$socket->send(json_encode($messageContent));

我在上面使用它来向特定用户发送消息,但是如果您创建一个所有用户都连接到的新频道,那么他们都会收到一条消息。

我的基于 Web 的应用程序在视图中使用 http://autobahn.ws/js/ 来订阅 Web-socket 提要。我看到它也有 android 实现,但我从未尝试过:http://autobahn.ws/android/

这是我的一个观点的示例代码,以防它对您有用:

<script src="http://autobahn.s3.amazonaws.com/js/autobahn.min.js"></script>
<script>
        var conn = new ab.Session('ws://your.domain.com:8081',
                function () 
                    // Subscribe to the "username" channel
                    // For each user this would be their own channel to receive notifications
                    // for their own events, like successful file generation..
                    // file upload, etc...
                    conn.subscribe('username', function (topic, data) 
                         $.simplyToast(data.message, type = data.type, delay = 8000);
                    );
                    // Subscribe to "system" channel. 
                    //In my app all users are subscribed to this one to receive system-wide 
                    // notifications.
                    conn.subscribe('system', function (topic, data) 
                         $.simplyToast(data.message, type = data.type, delay = 8000);
                    );
                ,
                function () 
                    console.warn('WebSocket connection closed');
                ,
                'skipSubprotocolCheck': true
        );
    </script>

【讨论】:

以上是关于带有codeigniter和android的websocket的主要内容,如果未能解决你的问题,请参考以下文章

带有 web.config 文件的 IIS 上的 Codeigniter 2

codeigniter:带有jwt-token的api,令牌也将在网站浏览期间过期

CodeIgniter 和 SimpleTest——如何进行我的第一个测试?

数据库驱动的 CodeIgniter Web 应用程序中的单元测试

使用 PHP 和 codeigniter 显示带有 foreach 函数的固定表

Codeigniter:如何使用 jQuery 添加带有多选和删除复选框的列