Я разрабатываю консольное приложение, используя TcpListener для получения запросов от клиентов:
Код: Выделить всё
mWebSocketServer = new TcpListener(ipWebSocketAddr, mcintWebSocketPort);
Код: Выделить всё
ipWebSocketAddrКод: Выделить всё
try {
mWebSocketServer.Start();
mWebSocketThread = new Thread(() => webSocketServer());
mWebSocketThread.Start();
} catch (Exception ex) {
FrmMain.UpdateTaskbar(ex.ToString());
}
Код: Выделить всё
public async void webSocketServer() {
Byte[] arybytData = new byte[1024];
while (mblnRunTillStopped == true) {
try {
TcpClient tcpClient = mWebSocketServer.AcceptTcpClient();
Console.WriteLine(FrmMain.strTimeStampMsg("webSocket client connected"));
NetworkStream stream = tcpClient.GetStream();
int i;
while ((i = stream.Read(arybytData, 0, arybytData.Length)) != 0) {
string strRX = System.Text.Encoding.ASCII.GetString(arybytData, 0, i);
Console.WriteLine(FrmMain.strTimeStampMsg("From web-client: " + strRX));
string strTX = "Acknowledge";
byte[] arybytTX = System.Text.Encoding.ASCII.GetBytes(strTX);
stream.Write(arybytTX, 0, arybytTX.Length);
}
Thread.Sleep(mcintWebSocketServerThreadSleep);
} catch (Exception ex) {
FrmMain.UpdateTaskbar(ex.Message);
}
}
}
Код: Выделить всё
webSocket.send(cstrSendMsg);
Код: Выделить всё
cstrSendMsgКод: Выделить всё
GET / HTTP/1.1
Host: 192.168.5.73:443
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/131.0.0.0 Safari/537.36
Upgrade: websocket
Origin: http://192.168.5.73
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Sec-WebSocket-Key: rlhgDPkLxwNFeA6pMZtNwg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Я использую Chrome (версия 131.0.6778.86) (Официальная сборка) (64-разрядная версия)) для клиента и для отладки.
Это клиентский скрипт:
Код: Выделить всё
webSocket = new WebSocket(cstrServerSocketIP);
webSocket.onclose = (event) => {
DebugMsg("webSocket.onclose");
};
webSocket.onerror = (event) => {
DebugMsg("webSocket.onerror");
if (typeof event == "object" && typeof event.data != "undefined") {
DebugMsg(event.data);
}
};
webSocket.onmessage = (event) => {
DebugMsg("webSocket.onmessage: " + event.data);
};
webSocket.onopen = (event) => {
DebugMsg("webSocket.onopen: " + event.data);
};
Код: Выделить всё
cstrServerSocketIPКод: Выделить всё
WebSocket connection to 'ws://192.168.5.73:443/' failed:
Код: Выделить всё
Received:
21-11-2024 14:46:03.937> From web-client:
GET / HTTP/1.1
Host: 192.168.5.73:443
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/131.0.0.0 Safari/537.36
Upgrade: websocket
Origin: http://192.168.5.73
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Sec-WebSocket-Key: iURnr6DRWqF2wbtypFsLig==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Response:
HTTP/1.1 1-1 Switching Protocols
Connection: Update
Upgrade: websocket
Sec-WebSocket-Accept: AFRdDliX+pqKnGCr652yekplUAI=
Вот что я делаю:
- Принять полученное значение, связанное с Sec-WebSocket-Key.
- Создать новую строку, которая является значением, связанным с Sec. -WebSocket-Key объединен с "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
- Создайте SHA1, используя результат 2.
- Base64 закодируйте результат из 3.
- Запишите результат из 4 в заголовок Sec-WebSocket-Accept.
Код: Выделить всё
public async void httpServer() {
while (mblnRunTillStopped == true) {
try {
HttpListenerContext ctx = await mListener.GetContextAsync();
HttpListenerRequest req = ctx.Request;
if (req.IsWebSocketRequest) {
HttpListenerWebSocketContext ctxWS = await ctx.AcceptWebSocketAsync(null);
Console.WriteLine("HERE");
}
Я все еще вижу в отладчике клиента:
Код: Выделить всё
WebSocket connection to 'ws://192.168.5.73:443/' failed:
Это пример запроса:
Код: Выделить всё
GET / HTTP/1.1
Host: 192.168.5.73:443
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/131.0.0.0 Safari/537.36
Upgrade: websocket
Origin: http://192.168.5.73
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Sec-WebSocket-Key: GysunwWXiQEX05sMpW7Y1g==
Код: Выделить всё
string strKey = strWebSocketKey + mcstrWebSocketMagicString;
Код: Выделить всё
byte[] arybytSHA1 = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(strKey));
Код: Выделить всё
strWebSocketAccept = Convert.ToBase64String(arybytSHA1);
Код: Выделить всё
HTTP/1.1 1-1 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: PuuJ05IxiUQuB9aBpBZCIBKCU38=
Код: Выделить всё
file.js:33 WebSocket connection to 'ws://192.168.5.73:443/' failed
И использовал ответ для сравнения и проверки правильности моего ответа, но тем не менее клиент сообщает Failed ?
Подробнее здесь: https://stackoverflow.com/questions/792 ... web-client
Мобильная версия