Получение данных от веб-клиента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


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

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

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

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

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

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