dongyi2889 2013-04-02 23:11
浏览 32

php socket_write

I'm trying to send some data (text) to the current socket.

Previously making hand shake - OK.

Then send data from client (Chrome, latest version) - socket_recv receives it - OK.

Then I'm trying to write to the same socket what I just read by socket_recv using socket_write - NOTHING.

Any errors (checked using socket_last_error and the function returns TRUE). It seems like all OK.

But onmessage event on the client-side not firing. Silence...

Who used websockets in PHP, please help.

Client:

var host = "ws://192.168.0.100:5000/wbs_r1.php";

try {
    var socket = new WebSocket(host);
    message('<p class="event">Socket Status: ' + socket.readyState);

    socket.onopen = function (msg) {
        message('<p class="event">Socket Status: ' + socket.readyState + ' (open)');
        console.log(socket);
        console.log(msg);
    }

    socket.onmessage = function (msg) {
        message('<p class="message">Received: ' + msg.data);
        console.log(socket);
        console.log(msg);
    }

    socket.onclose = function (msg) {
        message('<p class="event">Socket Status: ' + socket.readyState + ' (Closed)');
        console.log(socket);
        console.log(msg);
    }

    socket.onerror = function (msg) {
        message('Error: ');
        console.log(socket);
        console.log(msg);
    }

} catch (exception) {
    message('<p>Error' + exception);
    console.log(exception);
}

Server:

header('Content-Type: text/plain; charset=utf-8');
set_time_limit(0); 
error_reporting(E_ALL);
ob_implicit_flush(true);
$sockets = array(); 
$handshakes = array();

$sockets["wbs1"] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sockets["wbs1"], SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sockets["wbs1"], "0.0.0.0", 5000);
socket_listen($sockets["wbs1"], 20);
socket_set_nonblock($sockets["wbs1"]);

echo $sockets["wbs1"] . "
";

while(true) {
    $changed_sockets = $sockets;
    $num_sockets = socket_select($changed_sockets, $write = null, $exceptions = null, null);
    //print_r($changed_sockets);
    foreach($changed_sockets as $socket) {
        echo "


" . "Current socket: " . $socket . "
";
        if($socket == $sockets["wbs1"]) {
            if(($client = socket_accept($sockets["wbs1"])) >= 0) $sockets[] = $client;
            echo "Accepting socket ".$socket."
";
            echo "Client: " . $client . "
";
        } else {
            $index = array_search($socket, $sockets);
            $len = @socket_recv($socket, $buffer, 2048, 0);
            echo "Received " . $len . " bytes from socket ".$socket.": " . $buffer . "
";

            if($len == 0) {
                unset($sockets[$index]);
                unset($handshakes[$index]);
                socket_close($socket);
                echo "Closing socket " . $socket . "
";
            } else if(!isset($handshakes[$index])) {
                $buffer = substr($buffer, strpos($buffer, "Sec-WebSocket-Key: ") + 19);
                $accept = base64_encode(sha1(substr($buffer, 0, strpos($buffer, "
")) . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));

                $upgrade = "HTTP/1.1 101 Switching Protocols
" .
                    "Upgrade: websocket
" .
                    "Connection: Upgrade
" .
                    "Sec-WebSocket-Accept: {$accept}

" .
                    "Sec-Websocket-Extensions=x-webkit-deflate-frame". chr(0);

                socket_write($socket, $upgrade, strlen($upgrade));
                $handshakes[$index] = true;

                echo "Handshaking: " . $socket . "
";
            } else {
                $msg = "Hello!!!
\0";
                $wr = socket_write($socket,$msg);
                if(!$wr) echo socket_strerror(socket_last_error()) . "
";
                else echo "Writing to socket " . $socket . "
";
            }
        }
    }
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
    • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
    • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
    • ¥15 如何在炒股软件中,爬到我想看的日k线
    • ¥15 seatunnel 怎么配置Elasticsearch
    • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
    • ¥15 (标签-MATLAB|关键词-多址)
    • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
    • ¥500 52810做蓝牙接受端
    • ¥15 基于PLC的三轴机械手程序