Что ж, я пытаюсь подключиться к серверу Websocket, установленному в PHP (https://github.com/napengam/phpWebSocketServer/), с моим клиентом C# (https://github.com/sta/websocket-sharp).
Я делаю это с помощью форка оригинального проекта (https://www.nuget.org/packages/websocket-sharp-customheaders).
Я сделал следующее:
private static void TestWebSocketServer(IWebDriver web)
{
WebSocket ws = null;
try
{
ws = new WebSocket("wss://api.z3nth10n.net:8090"); // /web
}
catch (SocketException ex)
{
Console.WriteLine(ex, Color.Red);
}
if (ws != null)
{
try
{
ws.CustomHeaders = new Dictionary<string, string>
{
//{ "Accept-Encoding", "gzip, deflate" }, //gzip, deflate, br
//{ "Accept-Language", "en;q=0.8,en-GB;q=0.7" },
//{ "Cache-Control", "no-cache" },
{ "Connection", "Upgrade" },
{ "Host", "api.z3nth10n.net" },
{ "Origin", "https://api.z3nth10n.net" },
//{ "Pragma", "no-cache" },
//{ "Sec-WebSocket-Extensions", "permessage-deflate; client_max_window_bits" },
//{ "Sec-WebSocket-Key", Convert.ToBase64String(Encoding.UTF8.GetBytes("WebSocket rocks!")) },
//{ "Sec-WebSocket-Protocol", "actioncable-v1-json, actioncable-unsupported" },
{ "Sec-WebSocket-Version", "13" },
{ "Upgrade", "websocket" },
//{ "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" },
// { "Get", "web" }
};
ws.OnMessage += (sender, e) =>
Console.WriteLine("Message received" + e.Data);
ws.OnError += (sender, e) =>
Console.WriteLine("Error: " + e.Message);
ws.Connect();
}
catch (SocketException ex)
{
Console.WriteLine(ex, Color.Red);
}
if (ws.IsAlive)
SendMessage(ws, "Test from C#");
ws.Close();
}
Console.ReadKey(true);
}
private static void SendMessage(WebSocket ws, string message, string opcode = "broadcast")
{
var dictionary = new Dictionary<string, string>
{
{"opcode", opcode},
{"message", message}
};
ws.Send(JsonConvert.SerializeObject(dictionary));
}
Все Кажется, работает нормально. Но PHP выдает мне следующую ошибку при операции рукопожатия:
[WEBSOCKETSERVER | 2020-03-05 15:27:45.087373018264771] Handshake:G
[WEBSOCKETSERVER | 2020-03-05 15:27:45.087646007537842] Socket 18 - Handshake aborted - [HTTP/1.1 400 Bad Request
HTTP/1.1 426 Upgrade Required
Sec-WebSocketVersion: 13
HTTP/1.1 405 Method Not Allowed]
PHP Fatal error: Uncaught Error: Call to a member function onError() on string in /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/webSocketServer.php:253
Stack trace:
#0 /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/coreFunc.php(130): WebSocketServer->onError()
#1 /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/webSocketServer.php(112): WebSocketServer->Handshake()
#2 /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/runSocketServer.php(92): WebSocketServer->Start()
Просматривая код, я получаю следующую часть:
protected function Handshake($Socket, $Buffer) {
$this->Log('Handshake:' . $Buffer);
$addHeader = [];
$SocketID = intval($Socket);
$Headers = [];
$reqResource = [];
$Lines = explode("\n", $Buffer);
// ....
ИСТОЧНИК: https://github.com/napengam/phpWebSocketServer/blob/master/server/coreFunc.php#L81
Переменная $Buffer
равна "G" ... Итак, я вернулся к коду:
$Client = $this->Clients[$SocketID];
if ($Client->Handshake == false) {
$dataBuffer = fread($Socket, $this->bufferLength);
if ($this->Handshake($Socket, $dataBuffer)) {
// ...
SOURCE: https://github.com/napengam/phpWebSocketServer/blob/master/server/webSocketServer.php#L108
Итак, если $this->bufferLength
равен 40960, почему моя функция fread читает только строку из 1 байта (G)?
РЕДАКТИРОВАТЬ:
Я проверял соединение с помощью команды netcat
. (netcat -p 8090 -l -k -v
)
Но, очевидно, я не вижу, что находится на протоколе wss
, потому что он защищен шифрованием SSL.
Итак, я попытался подключиться с помощью ws
(на клиенте) и получение того, что выводит WebsocketSharp:
listening on [any] 8090 ...
connect to [192.168.x.xx] from 82.red-83-38-189.dynamicip.rima-tde.net [83.38.189.82] 5292
GET / HTTP/1.1
User-Agent: websocket-sharp/1.0
Host: api.z3nth10n.net:8090
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: pUqjINPcgM2hZAu6uKfmnQ==
Sec-WebSocket-Version: 13
Я пытался использовать ws на обоих (клиент и сервер), но не могу, потому что PHP выдает другую ошибку (я постараюсь исправить это).
Таким образом, вся информация отправляется клиентом C#, но в wss
отправляется только первый байт.
Существует еще один Javascript клиент (https://github.com/napengam/phpWebSocketServer/blob/master/webClient/socketWebClient.js), и он успешно подключен, это буфер квитирования:
[WEBSOCKETSERVER | 2020-03-05 16:41:30.048753023147583] New client connecting on socket #17
Starting handshake!
/var/www/api.z3nth10n.net/discord-bot-flooder/examples/phpWebSocketServer/server/coreFunc.php:87:
string(547) "GET /web HTTP/1.1
Host: api.z3nth10n.net:8090
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Upgrade: websocket
Origin: https://api.z3nth10n.net
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: _ga=GA1.2.26877450.1574982968
Sec-WebSocket-Key: EEBdJU41neAtetAYvEgj3A==
Sec-WebSocket-Extensions: permessage-"...
[WEBSOCKETSERVER | 2020-03-05 16:41:30.048943996429443] Handshake:GET /web HTTP/1.1
Host: api.z3nth10n.net:8090
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Upgrade: websocket
Origin: https://api.z3nth10n.net
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: _ga=GA1.2.26877450.1574982968
Sec-WebSocket-Key: EEBdJU41neAtetAYvEgj3A==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Итак, Idk, что не так с C# клиентом.