使用AsyncTcpConnection作为websocket客户端时出现报错

flareheart
<?php
require_once 'vendor/autoload.php';

use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker();
$worker->onWorkerStart = function($worker) {
    // ssl需要访问443端口
    $con = new AsyncTcpConnection('ws://api.xxxx.com:443/ws');

    // 设置以ssl加密方式访问,使之成为wss
    $con->transport = 'ssl';

    $con->onConnect = function($con) {
        echo 'Connected';
    };

    $con->onMessage = function($con, $data) {

    };

    $con->connect();
};

Worker::runAll();

出现了两处警告:
Warning: stream_socket_client(): Failed to enable crypto in D:\Visual-NMP-x64\www\WebSocket-API-demos-master\WebSocket_PHP-demo\workerman\Connection\AsyncTcpConnection.php on line 178
以及
Warning: stream_socket_client(): unable to connect to ssl://api.xxxx.com:443 (Unknown error) in D:\Visual-NMP-x64\www\WebSocket-API-demos-master\WebSocket_PHP-demo\workerman\Connection\AsyncTcpConnection .php on line 178

首先是无法连接;
其次,最初websocket的地址是 wss://api.xxxx.com/ws ,在AsyncTcpConnection 的connect方法中,$this->_remoteURI没有被拼接上去。
我改了这个部分的代码,但是错误依然存在。但是单独使用stream_socket_client接口测试时,是可以正常连接的,区别就在于我只传了一个参数,而AsyncTcpConnection中传了很多:
$this->_socket = stream_socket_client("{$this->transport}://{$this->_remoteHost}:{$this->_remotePort}{$this->_remoteURI}", $errno, $errstr, 0, STREAM_CLIENT_ASYNC_CONNECT);

因为workerman是composer引入的,不想修改这部分代码,免得今后难以升级,所以希望官方能解决类似问题。

5527 2 0
2个回答

walkor

这个是火币官方的websocket接口demo吧。

用最新版workerman 3.5.5 试下, https://github.com/walkor/Workerman
这个版本window linux系统都可以用

  • 暂无评论
yukai

你好,我切换为workerman 3.5.15版本之后还是不行,ws地址它自动加上了80端口,怎么去掉啊
 

  • walkor 2018-10-16

    像题主那样,地址里加上端口443

  • yukai 2018-10-16

    @1:请问从ws切换到wss需要修改那些地方啊,我现在ws已经可以使用了

年代过于久远,无法发表回答
🔝