TheTalion
@TheTalion

Websocket: прием сообщения и запись его части в отдельную переменную. Как осуществить?

У меня есть сервер и клиент. Общаются через вебсокет.
Кто-то из них посылает такое сообщение (не принципиально кто), например:
на C#
string CurPos = "F1";
string NewPos = "F2";
con.Send("Change position: " + CurPos + "-" + NewPos);

Но другой получает такое сообщение:
string newMsg = "Change position: F1-F2";
Как сделать, чтобы получаемые символы на определенных местах записывались в, например, заранее оглашенные переменные? Хотелось бы также увидеть пример реализации хотя бы с одной переменной, то не совсем понимаю, как это работает.

Пробовал сделать через Regex, но как я понял, он воспринимает просто строку, которая содержит совпадения по тексту, но не понял как разделить строку на подстроки, чтобы из них выделить отдельные переменные.
  • Вопрос задан
  • 466 просмотров
Решения вопроса 2
pi314
@pi314
Президент Солнечной системы и окрестностей
Как сделать, чтобы получаемые символы на определенных местах записывались в, например, заранее оглашенные переменные?


Для этого строку нужно разобрать, выделить интересующие подстроки и положить их в нужные переменные самостоятельно. Никакой магии, которая сделает это за Вас, нет. В этом смысле нет никакой разницы, откуда пришла строка: из вебсокета, с консоли или еще откуда-то :)

Сделать это можно регулярками, циклами или любым другим замысловатым способом, но, прежде, чем это делать, нужно понять, что именно делать. А тут возможны варианты.

1. Строка именно такая, как описано в вопросе, и изменить ее нет возможности, т.к. ее посылает "чужой" код.
Тогда нужно описать структуру разделителей интересующих частей регулярным выражением (если она вообще регулярна) и выделять их регуляркой, например, так:
string[] tokens = Regex.Split("Change position: F1-F2", @"(: )|(-)", RegexOptions.ExplicitCapture);

if( tokens.Length == 3 && string.Equals(tokens[0], "Change position") )
{
  curPos = tokens[1];
  newPos = tokens[2];
} else {
  // прислали какую-то непонятную хрень...
}

Поиграться, потестировать регулярки самостоятельно и посмотреть, что они могут разобрать, а что нет, можно, например, вот тут.

2. Строку можно определить самостоятельно.
Тогда лучше придумать протокол (конкретнее, формат строки), который было бы легко разбирать. Например:

event:cur-position:new-position

т.е. для данного примера посылать:

"Change position:F1:F2"

Такую строку можно разобрать элементарным
string[] tokens = "Change position:F1:F2".Split(':');

if( tokens.Length == 3 && string.Equals(tokens[0], "Change position") )
{
  curPos = tokens[1];
  newPos = tokens[2];
} else {
  // прислали какую-то непонятную хрень...
}


И в том, и в другом случае нужно помнить, что к вебсокету, в принципе, может подключиться не только "наш" клиент, но и вообще любой проказник и послать туда что-то, чего мы совсем не ожидаем. Соответственно, перед тем, как тупо разбирать, строку хорошо бы еще проверить на корректность и, по крайней мере, обработать возможные ошибки при разборе (этого в приведенном примере кода нет - задание для самостоятельного изучения).
Ответ написан
@Maxon4eg92
Тестировщик
Группировка в регулярных выражениях не подходит ?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы