gpt4 book ai didi

javascript - PHP 流套接字不适用于 HTML5 套接字?

转载 作者:太空狗 更新时间:2023-10-29 16:34:34 25 4
gpt4 key购买 nike

似乎大多数在线使用 PHP 的 HTML5 网络套接字示例都在使用套接字插件。是否可以将 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 网络套接字客户端。

<!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 响应?

最佳答案

您收到此错误 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 是应用层协议(protocol) - OSI 第 7 层。Websocket 使用通用套接字(单双工 TCP 连接)发送和接收数据。

如果没有进一步的实现,您无法将一个连接到另一个。 Websocket 建立在普通套接字之上。

参见:

关于javascript - PHP 流套接字不适用于 HTML5 套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43467668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com