请教UdpConnection用法

keya777777
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
// socket_bind($socket,"120.76.169.136",10001);
$connection_to_baidu = new UdpConnection($socket,'120.76.169.136:10001');
$connection_to_baidu->send($bin_data);

我想把workerman当成一个客户端给别的服务器发UDP消息来通信,在start.php中onWorkerStart的事件处理写了上面这段代码,为什么数据发送不出去?new UdpConnection($socket,'120.76.169.136:10001');这个类的构造函数里面的两个参数分别填写什么?

3478 8 0
8个回答

walkor

那个udp类不是用作udp客户端的。

发udp数据直接用php的接口就好了

$client = stream_socket_client('udp://120.76.169.136:10001');
stream_socket_sendto($client, $data);

  • 暂无评论
keya777777

多谢,按照你的方法,UDP消息可以发送和接受了。想请教一下UdpConnection这个类是在什么场景下用的?

  • 暂无评论
walkor
$worker = new Worker('udp://...');
$worker->onMessage = function($connection, $msg) {
        // 这里的$connection是UdpConnection实例
};
  • 暂无评论
keya777777

多谢。再请教一个问题,我想在wolkerman的start.php里面建立一个单例的socket(或者全局的socket也行),然后给其他PHP 文件都使用这个socket来通信,这个要怎么操作?我尝试在其他PHP里面包含start.php这个文件,提示有错误。

我这边的一个业务场景是:用web来和智能硬件通讯,web服务器侧目前用的是apache mysql php的方案,由于apache每次会将上次建立的socket自动回收,导致每次服务器与硬件通信时,使用的端口号都不一样。因此想用wolkerman的不释放socket的特性来保证服务器侧的端口号固定。

  • 暂无评论
walkor
  • 暂无评论
keya777777

多谢,用链接里面的方法可以了。只是这些UDP通讯好像都是同步串行通讯的,workerman能做到UDP的异步通讯吗?

  • 暂无评论
walkor

workerman自身的通讯都是异步的

  • keya777777 2017-07-19

    为什么我用wiresh抓包,看到的workerman发出来的UDP都是串行的,前面的包没有收到应答或者超时,后面的包就不发送。我把代码和wireshark抓包截图发一下,有时间帮忙看一下,多谢。

  • walkor 2017-07-19

    通讯是异步的,但是你的业务逻辑是串行的。
    类似你做事情(业务)是串行的,但是如果你做事情的同时给其他人发快递(发送消息),那么这个快递传输过程中不用你参与,有公司快递人员(操作系统)自动给你发送到。

  • keya777777 2017-07-19

    我们的业务逻辑是要求并行的,这里可能是我们设计或者编码上有些问题。能否指点一下我们需要怎么改,我们的目前业务流程是在批量控制智能硬件时,先从web前端发起HTTP请求(同时有多个HTTP请求访问同一个PHP文件多次,每个HTTP请求最终要发送数据的硬件不是同一个),由apache处理这些HTTP请求,在上述PHP文件里面给workerman监听的UDP端口发送消息,然后workerman发送UDP到部署在云上面的代理服务器,最后由代理服务器分开发送到每个智能硬件。
    上面这个方案导致的问题是如果某个智能硬件出了问题,没有及时应答UDP消息,会导致整个批量控制硬件过程非常耗时。

  • walkor 2017-07-19

    workerman没有udp客户端,所以你这个要异步做业务逻辑比较难。

  • keya777777 2017-07-19

    那是否如果硬件和中间的代理都改成TCP通讯,可以在这种业务逻辑下实现异步通讯?是必须用TCP长链接,还是长连接和短连接都可以?

  • keya777777 2017-07-19

    另外问一下,如果我不用apache,直接用workerman来监听HTTP请求,能做到UDP的异步吗。

  • walkor 2017-07-19

    我不是很清楚你们的业务,理论上是可以的

  • keya777777 2017-07-19

    多谢。我后面写个demo测试一下

keya777777
$ws_worker->onWorkerStart = function($ws_worker)
{
    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
    $inner_udp_worker = new Worker('udp://192.168.1.102:5678');

    $inner_udp_worker->onMessage = function($connection, $buffer)
    {
        global $ws_worker;

        $host = SERVERIP;

        $port = SERVERPROT;
        $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        //        socket_bind($socket,'192.168.1.102',2348);
//                    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
//                    $timeout = array('sec'=>5,'usec'=>0);
//                    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
//                    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);

        socket_sendto($socket, $buffer, strlen($buffer), 0, $host, $port);
        socket_recvfrom($socket, $buf, 2048, 0, $host, $port);

        // 返回推送结果
        $connection->send($buf);
    };
    $inner_udp_worker->listen();

};
  • 暂无评论
年代过于久远,无法发表回答
🔝