Websocket wil niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pipo Clown

Pipo Clown

29/12/2013 20:13:59
Quote Anchor link
Ik ben aan het proberen om met websocket te werken maar op de één of andere vage manier wil dit nog niet lukken.

Ik probeer een voorbeeld te volgen vanaf deze pagina :
http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

Ik heb de bestanden gedownload en, volgens mij, op de juiste wijze aangepast.

index.php :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8' />
<style type="text/css">
<!--
.chat_wrapper {
    width: 500px;
    margin-right: auto;
    margin-left: auto;
    background: #CCCCCC;
    border: 1px solid #999999;
    padding: 10px;
    font: 12px 'lucida grande',tahoma,verdana,arial,sans-serif;
}
.chat_wrapper .message_box {
    background: #FFFFFF;
    height: 150px;
    overflow: auto;
    padding: 10px;
    border: 1px solid #999999;
}
.chat_wrapper .panel input{
    padding: 2px 2px 2px 5px;
}
.system_msg{color: #BDBDBD;font-style: italic;}
.user_name{font-weight:bold;}
.user_message{color: #88B6E0;}
-->
</style>
</head>
<body>    
<?php
$colours
= array('007AFF','FF7000','FF7000','15E25F','CFC700','CFC700','CF1100','CF00BE','F00');
$user_colour = array_rand($colours);
?>


<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

<script language="javascript" type="text/javascript">  
$(document).ready(function(){
    //create a new WebSocket object.
    var wsUri = "ws://localhost:9000/chattest/server.php";     
    websocket = new WebSocket(wsUri);
    
    websocket.onopen = function(ev) { // connection is open
        $('#message_box').append("<div class=\"system_msg\">Connected!</div>"); //notify user
    }

    $('#send-btn').click(function(){ //use clicks message send button    
        var mymessage = $('#message').val(); //get message text
        var myname = $('#name').val(); //get user name
        
        if(myname == ""){ //empty name?
            alert("Enter your Name please!");
            return;
        }
        if(mymessage == ""){ //emtpy message?
            alert("Enter Some message Please!");
            return;
        }
        
        //prepare json data
        var msg = {
        message: mymessage,
        name: myname,
        color : '<?php echo $colours[$user_colour]; ?>'
        };
        //convert and send data to server
        websocket.send(JSON.stringify(msg));
    });
    
    //#### Message received from server?
    websocket.onmessage = function(ev) {
        var msg = JSON.parse(ev.data); //PHP sends Json data
        var type = msg.type; //message type
        var umsg = msg.message; //message text
        var uname = msg.name; //user name
        var ucolor = msg.color; //color

        if(type == 'usermsg')
        {
            $('#message_box').append("<div><span class=\"user_name\" style=\"color:#"+ucolor+"\">"+uname+"</span> : <span class=\"user_message\">"+umsg+"</span></div>");
        }
        if(type == 'system')
        {
            $('#message_box').append("<div class=\"system_msg\">"+umsg+"</div>");
        }
        
        $('#message').val(''); //reset text
    };
    
    websocket.onerror    = function(ev){$('#message_box').append("<div class=\"system_error\">Error Occurred - "+ev.data+"</div>");};
    websocket.onclose     = function(ev){$('#message_box').append("<div class=\"system_msg\">Connection Closed</div>");};
});
</script>
<div class="chat_wrapper">
<div class="message_box" id="message_box"></div>
<div class="panel">
<input type="text" name="name" id="name" placeholder="Your Name" maxlength="10" style="width:20%"  />
<input type="text" name="message" id="message" placeholder="Message" maxlength="80" style="width:60%" />
<button id="send-btn">Send</button>
</div>
</div>

</body>
</html>


server.php :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
$host
= 'localhost'; //host
$port = '9000'; //port
$null = NULL; //null var

//Create TCP/IP sream socket

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//reuseable port
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

//bind socket to specified host
socket_bind($socket, 0, $port);

//listen to port
socket_listen($socket);

//create & add listning socket to the list
$clients = array($socket);

//start endless loop, so that our script doesn't stop
while (true) {
    //manage multipal connections
    $changed = $clients;
    //returns the socket resources in $changed array
    socket_select($changed, $null, $null, 0, 10);
    
    //check for new socket
    if (in_array($socket, $changed)) {
        $socket_new = socket_accept($socket); //accpet new socket
        $clients[] = $socket_new; //add socket to client array
        
        $header = socket_read($socket_new, 1024); //read data sent by the socket
        perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake
        
        socket_getpeername($socket_new, $ip); //get ip address of connected socket
        $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected'))); //prepare json data
        send_message($response); //notify all users about new connection
        
        //make room for new socket

        $found_socket = array_search($socket, $changed);
        unset($changed[$found_socket]);
    }

    
    //loop through all connected sockets
    foreach ($changed as $changed_socket) {    
        
        //check for any incomming data
        while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
        {

            $received_text = unmask($buf); //unmask data
            $tst_msg = json_decode($received_text); //json decode
            $user_name = $tst_msg->name; //sender name
            $user_message = $tst_msg->message; //message text
            $user_color = $tst_msg->color; //color
            
            //prepare data to be sent to client

            $response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color)));
            send_message($response_text); //send data
            break 2; //exist this loop
        }
        
        $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
        if ($buf === false) { // check disconnected client
            // remove client for $clients array

            $found_socket = array_search($changed_socket, $clients);
            socket_getpeername($changed_socket, $ip);
            unset($clients[$found_socket]);
            
            //notify all users about disconnected connection
            $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
            send_message($response);
        }
    }
}

// close the listening socket
socket_close($sock);

function
send_message($msg)
{

    global $clients;
    foreach($clients as $changed_socket)
    {
        @
socket_write($changed_socket,$msg,strlen($msg));
    }

    return true;
}



//Unmask incoming framed message
function unmask($text) {
    $length = ord($text[1]) & 127;
    if($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    }

    elseif($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    }

    else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }

    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i%4];
    }

    return $text;
}


//Encode message for transfer to client.
function mask($text)
{

    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);
    
    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header.$text;
}


//handshake new client.
function perform_handshaking($receved_header,$client_conn, $host, $port)
{

    $headers = array();
    $lines = preg_split("/\r\n/", $receved_header);
    foreach($lines as $line)
    {

        $line = chop($line);
        if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
        {

            $headers[$matches[1]] = $matches[2];
        }
    }


    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //hand shaking header
    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "WebSocket-Origin: $host\r\n" .
    "WebSocket-Location: ws://$host:$port/chattest/server.php\r\n".
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_conn,$upgrade,strlen($upgrade));
}

?>


Om de server te starten gebruik ik het volgende php-bestand :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    shell_exec('php -q c:/xampp/htdocs/chattest/server.php 2>&1 > /dev/null &');
?>


Als server draai ik XAMPP onder Windows8-64 bit, hier heb ik onder de directory 'htdocs' een subdirectory 'chattest' aangemaakt waar bovenstaande 3 php bestanden in staan.

Nadat in index.php gestart heb krijg ik de foutmelding 'Error Occurred - undefined'.

Zelf ben ik er vrij zeker van dat het server deel niet opgestart wordt, ik begrijp alleen niet waarom. Wie helpt mij om dit aan de praat te krijgen ?

Alvast bedankt.
Gewijzigd op 29/12/2013 20:23:54 door Pipo Clown
 
PHP hulp

PHP hulp

20/09/2019 00:09:03
 
Christian k

christian k

29/12/2013 21:54:57
Quote Anchor link
Heb je de socket wel geinstalleert?
 
Pipo Clown

Pipo Clown

29/12/2013 22:20:00
Quote Anchor link
Volgens mij wel.

Dit doe ik toch door eenmalig het volgende stukje PHP-code aan te roepen :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    shell_exec('php -q c:/xampp/htdocs/chattest/server.php 2>&1 > /dev/null &');
?>
 
Christian k

christian k

30/12/2013 10:35:03
Quote Anchor link
Ik weet het niet hoe dat met windows werkt maar op ubuntu moest je
Wat comandos in de terminal intypen
 
Pipo Clown

Pipo Clown

31/12/2013 15:30:21
Quote Anchor link
Op mijn localhost heb ik het nu daaiende, dit doordat ik daar de XAMPP-Shell kon gebruiken.

De volgende stap is om het op de NAS aan de praat te krijgen, geen idee hoe ik daar een Shell kan gebruiken.

Ik heb nu onderstaande code welke ik eenmalig aan roep, deze code staat in een php-bestandje dat in dezelfde map staat als server.php en index.php :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    $result
= exec("php -q ".getcwd()."/server.php 2>&1");
    echo $result;
?>


Het resultaat hiervan is :

"sh: php: command not found"

Wie kan mij vrtellen hoe ik PHP hier bereikbaar krijg ?
 
- Ariën -
Beheerder

- Ariën -

31/12/2013 15:35:19
Quote Anchor link
Kijk eens met phpinfo() waar PHP geinstalleerd is, en gebruik dat path i.p.v. 'php'
 
Pipo Clown

Pipo Clown

31/12/2013 17:26:55
Quote Anchor link
Ik heb ondertussen de volgende code :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
echo getcwd().'/server.php<br><br>';   // Het huidige path

$php_cmd = PHP_BINDIR.'/php';  //  Het path naar PHP
echo $php_cmd;  //  Het path naar PHP

scandir($php_cmd);  //  Inhoud PHP-directory


    $result = exec($php_cmd." -q ".getcwd()."/server.php 2>&1");
echo $result;

?>


Met als resultaat :

/share/MD0_DATA/Web/midlife-info/chat/server.php (Curr-dir)

/root/daily_build/3.8.x/Model/TS-421/../../NasMgmt/HTTP/php5/bin/php (PHP-dir)

Warning: scandir(/root/daily_build/3.8.x/Model/TS-421/../../NasMgmt/HTTP/php5/bin/php) [function.scandir]: failed to open dir: No such file or directory in /share/MD0_DATA/Web/midlife-info/chat/st.php on line 7 (Foutmelding van scandir)

Scandir lijkt uitgevoerd te worden, net als shell_exec, vanuit de current directory en niet vanuit de root waardoor de PHP-dir niet gevonden kan worden.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.