PHP流套接字不能与HTML5套接字一起使用?

问题描述 投票:5回答:1

似乎大多数使用PHP在线的HTML5 Web套接字示例正在使用套接字插件。是否可以将stream_socket_server与HTML5网络套接字一起使用?

如果是的话,我正在尝试使用PHP stream_socket_server函数构建一个简单的套接字服务器+客户端。这是代码:

PHP套接字服务器:

<?php   
$server = stream_socket_server("tcp://localhost:8080", $errno, $errorMessage);

if ($server === false) {
    throw new UnexpectedValueException("Could not bind to socket: $errorMessage");
}

for (;;) {
    $client = stream_socket_accept($server);

    if ($client) {
        echo 'Connection accepted from '.stream_socket_get_name($client, false) . "\n";
        stream_copy_to_stream($client, $client);
    }
}

HTML5 Web套接字客户端。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Client Testing</title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
</head>
<body>
    <button id="send">Testing button</button>
    <script>
        websocket = new WebSocket("ws://localhost:8080");
        websocket.onopen = function(evt) { /* do stuff */ }; //on open event
        websocket.onclose = function(evt) { /* do stuff */ }; //on close event
        websocket.onmessage = function(evt) { /* do stuff */ }; //on message event
        websocket.onerror = function(evt) { /* do stuff */ }; //on error event
        $('#send').click( function(){
            websocket.send("This is a testing message"); //send method
        });
        //websocket.close(); //close method
    </script>
</body>
</html>

这是我连接时的回报:

WebSocket connection to 'ws://localhost:8080/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE

我错过了什么?如何返回有效的HTTP响应?

javascript php html5 sockets
1个回答
2
投票

你得到这个错误ERR_INVALID_HTTP_RESPONSE,因为你没有通过你的套接字发送适当的响应。

从服务器到客户端的响应如下所示:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

所以你需要把它写到套接字:

socket_write($accept, $httpResponse);

您还需要通过socket_select()实现轮询,目前您的程序无法处理多个连接。

当你完成时也不要忘记使用socket_close()


老答案

在OSI第4层上打开通用套接字。打开UNIX套接字,TCP套接字和UDP套接字。

也可以在较低的OSI层上打开套接字,例如ICMP甚至IP,通常称为“原始套接字”。

Websocket是一个应用层协议--OSI层7.Websocket使用通用套接字(单双工TCP连接)来发送和接收其数据。

如果没有进一步的实施,你就无法将它们连接到另一个Websocket基于普通套接字构建。

看到:

© www.soinside.com 2019 - 2024. All rights reserved.