Получение данных от веб-клиентаC#

Место общения программистов C#
Ответить
Anonymous
 Получение данных от веб-клиента

Сообщение Anonymous »

[Изменить] Пожалуйста, перейдите вниз, чтобы увидеть последние изменения...
Я разрабатываю консольное приложение, используя TcpListener для получения запросов от клиентов:

Код: Выделить всё

mWebSocketServer = new TcpListener(ipWebSocketAddr, mcintWebSocketPort);

Код: Выделить всё

ipWebSocketAddr
содержит 192.168.5.73, mcintWebSocketPort содержит 443. Начинаю слушать и создаю тред для управления клиентами и полученными данными:

Код: Выделить всё

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
содержит msg=US. В приложении C# я сообщаю все полученные данные в консоль, что вижу:

Код: Выделить всё

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
содержит ws://192.168.5.73:443/, после одного шага через это я вижу в отладчике Chrome:

Код: Выделить всё

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-Accept?
Вот что я делаю:
  • Принять полученное значение, связанное с Sec-WebSocket-Key.
  • Создать новую строку, которая является значением, связанным с Sec. -WebSocket-Key объединен с "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
  • Создайте SHA1, используя результат 2.
  • Base64 закодируйте результат из 3.
  • Запишите результат из 4 в заголовок Sec-WebSocket-Accept.
[Edit2] Я изменил исходный поток, поэтому один и тот же поток должен работать как для HTTP, так и для веб-сокетов, модификация, работа над которой находится в стадии разработки, но, похоже, она сломала веб-сервер:[Edit2] п>

Код: Выделить всё

        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");
}
Он не попадает в 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==
Затем я беру значение GysunwWXiQEX05sMpW7Y1g== и добавляю 258EAFA5-E914-47DA-95CA-C5AB0DC85B11

Код: Выделить всё

string strKey = strWebSocketKey + mcstrWebSocketMagicString;
Затем я создаю ключ SHA1:

Код: Выделить всё

byte[] arybytSHA1 = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(strKey));
И, наконец, кодировка base64:

Код: Выделить всё

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
Я нашел этот пост: сгенерируйте «Sec-WebSocket-Accept» из «Sec-WebSocket-Key»
И использовал ответ для сравнения и проверки правильности моего ответа, но тем не менее клиент сообщает Failed ?

Подробнее здесь: https://stackoverflow.com/questions/792 ... web-client
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»