简体   繁体   中英

websocket php server wss error

I have this code on http://example.com/push8/index.html

index.html

<script src="websocket.js"></script>
<script>
var Server;

    function log(text) {
        $log = $('#log');
        //Add text to log
        $log.append(($log.val()?"\n":'')+text);
        //Autoscroll
        $log[0].scrollTop = $log[0].scrollHeight - $log[0].clientHeight;
    }

    function send(text) {
        Server.send('message', text);
    }

    $(document).ready(function() {
        log('Conectando...');
        Server = new FancyWebSocket('wss://myip:port'); //or ws if I use HTTP

        $('#message').keypress(function(e) {
            if ( e.keyCode == 13 && this.value ) {
                log( 'You: ' + this.value );
                send( this.value );
                $(this).val('');
            }
        });

        //Let the user know we're connected
        Server.bind('open', function(){
            log( "Conectado." );
        });

        //OH NOES! Disconnection occurred.
        Server.bind('close', function(data){
            log( "Desconectado." );
        });

        //Log any messages sent from server
        Server.bind('message', function(payload){
            log( payload );
        });

        Server.connect();
    });
 </script>

websocket.js

 var WebSocket = function(url)
 {
    var callbacks = {};
    var ws_url = url;
    var conn;

    this.bind = function(event_name, callback){
        callbacks[event_name] = callbacks[event_name] || [];
        callbacks[event_name].push(callback);
        return this;// chainable
    };

    this.send = function(event_name, event_data){
        this.conn.send( event_data );
        return this;
    };

    this.connect = function() {
        if ( typeof(MozWebSocket) == 'function' )
            this.conn = new MozWebSocket(url);
        else
            this.conn = new WebSocket(url);

        // dispatch to the right handlers
        this.conn.onmessage = function(evt){
            dispatch('message', evt.data);
        };

        this.conn.onclose = function(){dispatch('close',null)}
        this.conn.onopen = function(){dispatch('open',null)}
    };

    this.disconnect = function() {
        this.conn.close();
    };

    var dispatch = function(event_name, message){
        var chain = callbacks[event_name];
        if(typeof chain == 'undefined') return; // no callbacks for this event
        for(var i = 0; i < chain.length; i++){
            chain[i]( message )
        }
    }
 };

and the server.php

 <?php
 // prevent the server from timing out
 set_time_limit(0);

 // include the web sockets server script (the server is started at the far bottom of this file)
 require 'class.PHPWebSocket.php';

 // when a client sends data to the server
 function wsOnMessage($clientID, $message, $messageLength, $binary) {
    global $Server;
    $ip = long2ip( $Server->wsClients[$clientID][6] );
    if ($messageLength == 0){/*check if message length is 0*/
        $Server->wsClose($clientID);
        return;}
        foreach ($Server->wsClients as $id => $client){
            if ($id != $clientID){$Server->wsSend($id, "Visita $clientID($ip): \"$message\" (tu id es: $id)");}}

 }

 // when a client connects
 function wsOnOpen($clientID){
    global $Server;
    $ip=long2ip($Server->wsClients[$clientID][6]);
    $Server->log( "$ip ($clientID) se ha conectado." );
 }

 // when a client closes or lost connection
 function wsOnClose($clientID, $status) {
    global $Server;
    $ip=long2ip($Server->wsClients[$clientID][6]);
    $Server->log("$ip ($clientID) se ha desconectado.");
 }

 // start the server
 $Server = new PHPWebSocket();
 $Server->bind('message', 'wsOnMessage');
 $Server->bind('open', 'wsOnOpen');
 $Server->bind('close', 'wsOnClose');
 $Server->wsStartServer('myip', 'port');
 ?>

This code works perfectly when I use a HTTP connection but when I use the HTTPS doesn't work. The error is:

WebSocket connection to 'wss://myip:port/' failed: Error in connection establishment: net::ERR_CONNECTION_CLOSED

I tried different ways like:

  1. on apache config, I added ProxyPass "/push8" "ws://localhost:port"
  2. I installed engintron and I added the same.

It didn't work...

Note: I use the default Cpanel config and Centos.

I don't know if you've solved this yet. But for anyone looking for a solution, this is what I had to do. I'm running Apache2 on Debian, PHP 7.

Make sure that the php proxy_wstunnel_module is installed.

In the file proxy_wstunnel.load inside the /etc/apache2/mods-available folder. Add the line you added to the php.ini file. For me it did not work adding it to the php.ini file.

ProxyPass "/push8" "ws://localhost:port/"

service php7.0-fpm stop service php7.0-fpm start

Restart Apache and your websocket should connect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM