gpt4 book ai didi

perl - WebSocket 服务器从头开始显示操作码 -1

转载 作者:行者123 更新时间:2023-12-02 22:29:32 26 4
gpt4 key购买 nike

我正在尝试从头开始在 Perl 中创建一个简单的 WebSocket 服务器,当我在 Google Chrome 中尝试它时,它给了我操作码 -1,我该如何修复它?

websocket.pl

#!/usr/bin/perl -w
use strict;
use IO::Socket::INET;
use Digest::SHA1 "sha1_base64";

$| = 1;

my $magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";


# Create a server
my $socket = IO::Socket::INET->new( LocalHost => 'localhost',
LocalPort => 7777,
Proto => 'tcp',
Listen => 5,
Reuse => 1
) || die "$!";

print "Server is running on port 7777\n";


while (1) {
my $client = $socket->accept();
my $key = "";

# Get the Request
my $data = "";
while (my $line = <$client>) {
$data .= $line;
}

# Get the Sec-WebSocket-Key value
foreach my $line ( split /\n/ => $data ) {
if ( $line =~ /^Sec-WebSocket-Key: (\S+)/ ) {
$key = $1;
}
}
print "Sec-WebSocket-Key: $key\n";

# Create the Sec-WebSocket-Accept header value
my $accept = sha1_base64($key);
$accept .= "="x(4-(length($accept)%4));
print "Sec-WebSocket-Accept: $accept\n";

# Response
print $client "HTTP/1.1 101 Switching Protocols\r\n";
print $client "Upgrade: websocket\r\n";
print $client "Connection: Upgrade\r\n";
print $client "Sec-WebSocket-Accept: $accept\r\n\r\n";

shutdown($client, 1);
}

$socket->close();

我很确定返回到网站的 key 是正确的,那么问题出在哪里呢?出了什么问题?

ws.js

var ws = new WebSocket("ws://localhost:7777/");

ws.onopen = function() {
alert("connected!");
ws.send( 'Hello server' );
};

ws.onclose = function() {
alert( 'Connection is closed... ');
};

Web Browser network traffic

编辑

Stefan Becker:是的,我知道,但在这种情况下,我确定请求低于 1024 字节,我已经修复了它,谢谢。

最佳答案

(操作码 -1)是一般错误。在你的情况下,这是一个坏的Sec-WebSocket-Accept header 。您忘记使用$magic_string :

my $accept = sha1_base64($key.$magic_string);

还有while (my $line = <$client>) {可能会永远运行。您需要检查是否有空行。

关于perl - WebSocket 服务器从头开始显示操作码 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55281448/

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