我用 PHP 制作了一个 WebSocket 服务器,并添加了向服务器添加 SSL/TLS 的功能。现在我使用stream_socket_enable_crypto启用了加密,一切正常。我读取数据并解密。只是 HTTP 请求有点奇怪:
客户端发送:
GET / HTTP/1.1
Host: example.com:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0
Accept: */*
...
服务器接收:
HTTP/1.1
Host: example.com:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0
Accept: */*
...
我的问题是:丢失字节的原因是什么?我该怎么做才能取回这些字节?
我使用 PHP 8.2
服务器:
终端:
openssl genrsa -out wss.key 2048 && openssl req -key wss.key -new -x509 -days 365 -out wss.crt
PHP:
error_reporting(E_ALL);
ini_set("display_errors", "1");
if(ob_get_level() == 0) ob_start();
$server = stream_socket_server("tcp://example.com:8080", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
stream_context_set_option($server, ["ssl" => [
"local_cert" => __DIR__."/wss.crt",
"local_pk" => __DIR__."/wss.key",
"disable_compression" => true,
"verify_peer" => false,
"verify_peer_name" => false,
"allow_self_signed" => true
]]);
$done = false;
while(!$done) {
$sockets = ["server" => $server];
if(stream_select($sockets, $w, $e, 0, 20) === false)
show("ERROR");
if(in_array($server, $sockets)) {
$client = stream_socket_accept($server);
$sockets[] = $client;
stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
}
foreach($sockets as $client) {
if(!in_array($client, $sockets))
continue;
show(fread($client, 100));
fclose($client);
$done = true;
show("EXIT");
}
}
function show(...$data) {
var_dump($data);
@ob_flush();
flush();
}
客户:
JS:
url = "ws://example.com:8080";
socket = new WebSocket(url);
setTimeout(() => {
socket.close();
socket = new WebSocket(url);
}, 1000);
更改
example.com:8080
与您的主机和端口
详细代码请查看PHPWS