|
5 / 2 / 3
Регистрация: 20.10.2017
Сообщений: 16
|
|||||||||||||||||||||
Не могу получить сообщение, пока не отправлю своё. Или не могу отправить своё пока не получу чужое19.01.2025, 16:15. Показов 767. Ответов 5
Метки нет (Все метки)
Выглядит это вот так:
Сервер:
Сервер запускается так:
0
|
|||||||||||||||||||||
| 19.01.2025, 16:15 | |
|
Ответы с готовыми решениями:
5
Счетчик скачивания софта или есть идея, а реализовать в коде не могу пока Не могу применить свое разрешение Не могу установить свое название таблицы |
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
|||||||
| 19.01.2025, 16:41 | |||||||
Нету message framing-а у вас. Добавлено через 3 минуты И смысл в json-е отправлять? С таким же успехом проще подключить SignalR и намного быстрее напишите ваш чатик. Тот же gRPC приблизительно в 6 раз быстрее json (сам не проверял, это все от ByteByteGo инфа). Проще вам взять protobuf и кодировать именно в нем, если уж в сокеты полезли, тогда их использование будет оправдано.
0
|
|||||||
|
5 / 2 / 3
Регистрация: 20.10.2017
Сообщений: 16
|
|
| 19.01.2025, 17:09 [ТС] | |
|
Честно говоря, о таком даже не думал. С этим методом - то понятно, что он ждёт отправки сообщения при подключении, просто метод StartChatAsync, мне казалось, будет сразу забирать отправленное одним сообщение и раздавать его всем остальным, ведь сообщение "сообщение доставлено" он сразу отправляет, может, там можно что-то исправить или надо вообще по-другому это делать? Может у меня сообщения слишком короткие, всё вроде читается целиком. Или это связано не с длиной? И второе: что такое message framing?
0
|
|
|
5 / 2 / 3
Регистрация: 20.10.2017
Сообщений: 16
|
|
| 19.01.2025, 17:09 [ТС] | |
|
Честно говоря, о таком даже не думал. С этим методом - то понятно, что он ждёт отправки сообщения при подключении, просто метод StartChatAsync, мне казалось, будет сразу забирать отправленное одним сообщение и раздавать его всем остальным, ведь сообщение "сообщение доставлено" он сразу отправляет, может, там можно что-то исправить или надо вообще по-другому это делать? Может у меня сообщения слишком короткие, всё вроде читается целиком. Или это связано не с длиной? И второе: что такое message framing?
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
||||||||||||||
| 19.01.2025, 18:26 | ||||||||||||||
|
- Length prefix-based (на основе длины сообщения, когда длина каждого сообщения - известная величина) Перед каждый сообщением отправляется его длина(в байтах), и только затем само сообщение - Delimiter-based - на основе разделителя между сообщениями (когда размеры сообщений заранее не известны, в http так работает, насколько я знаю)
Тогда будет уже проще понимать, что надо писать и зачем. Добавлено через 14 минут
Поместится только 256 UTF8 (два байта на один кириллический символ) символов. И вот собеседник расписал на 300 символов, то тут нужно: 1. Как минимум прочитать дважды. (дважды вызвать socket.ReceiveAsync) 2. Положить это в массив бОльшего размера, так как в 512-байтовый массив уже такое сообщение не влезет.
1
|
||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||
| 19.01.2025, 23:20 | |||||||||||||||||||||||||||||||||||||||||||||||
|
.flag
Добавлено через 2 часа 38 минут Окей, с чего бы начать... 1. Судя по всему вы пишете игру в Unity. Вам не нужно для сетевой логики наследоваться от базовых классов для скриптов и писать скорее как для консоли. Т.е. ваш сетевой код должен жить отдельной жизнью и через определенный контракта (делегаты, ивенты или внедрения зависимостей) взаимодействовать с предметами на сцене. Попытка засунуть это в базовый скрипт ничем хорошим не закончится. 2. Если у вас игра подразумевает реал-тайм взаимодействие (например бег персонажа), то сразу копаем в сторону UDP. Проблема в том что TCP работает как неразрывный поток, поэтому лаги/задержки в сети тормозят весь трафик. Из-за этого TCP хорошо применим для каких-нибудь шахмат, но абсолютно недопустим например для шутера. 3. Работа с TCP для много клиентского случая подразумевает выделение подключения в сессию. Грубо говоря ваш код, где объявлен listener должен заниматься только тремя вещами: - ожидать нового входящего подключения и выделять его в сессию на основе TcpClient - собирать сессии в единый список, чтобы можно было взаимодействовать с ними - убирать отключившихся клиентов из этого списка ВАЖНО! Всё это будет происходить в многопоточной среде, поэтому обычный List<T> тут не применим. Либо придется всё делать хотя бы в lock сегментах, иначе вам грозит падение сервака. 4. Сессия подразумевает под собой четыре вещи: - какую-то базовую инкапсулированную инфу о подключенном клиенте. Например после авторизации записываем его логин. - поток/задачу, которая просто читает беспрерывно сообщения и отсылает их на обработку - очередь(!) для отправки сообщений. Именно очередь, и причем потоко-безопасную т.к. отправить что-то клиенту может понадобиться из разных модулей - уведомление о отключении. Т.е. Сессия должна информировать внешний код, что она "всё". Нужно для того же listener выше. 5. Как правильно заметил выше IamRain -- вам нужен протокол. Грубо говоря набор "сообщений", как они кодируются в байты и считываются обратно. В идеале -- использовать бинарную (де)сериализацию, т.к. она найболее быстрая и на выходе получаете минимальный объем трафика. Если говорить про тот же TCP, то там вообще вся работа сводиться к Stream, не разобравшись с ним будете страдать. Ну и ошибки по вашему коду....
class MessageType { public string Prp1 {get; set;} ... } который содержит сообщение, а не весь клиент пихать.Также вам никто не гарантирует что сообщение прийдет единым куском. В теории может прилететь хоть по одному(!) байту. Т.е. отправили "{ text: "привет!" }", а пришло "{ text: "при". В итоге ваше десериализация падает. Вспоминаем что выше вам писали про протокол.
NetworkStream не привязывается к сокету, и по закрытию потока не грохнется и сам сокет. Ну и пересоздавать поток каждый раз -- плохо.
------------------------------------------------------------------ В общем, тут переписывать приблизительно 90% кода. Если вы пишете по какомму-то гайду весь этот ужас -- гайд плохой. Добавлено через 7 минут Но есть проблема с тем что обычно при попытки считать очередное сообщение из закрытого потока приводит к ошибке. Можно игнорировать по catch, но в идеале нужно писать wrapper над Stream, который будет определять что в потоке появились новые данные и только тогда пинать чтение данных. Это если говорить о практической реализации, понятное дело что (де)сериализация подразумевает что внутри как-то указывается размер данных, просто нам уже про это не нужно заморачиваться.
0
|
|||||||||||||||||||||||||||||||||||||||||||||||
| 19.01.2025, 23:20 | |
|
Помогаю со студенческими работами здесь
6
Не могу найти свое приложение на wp в магазине Не могу установить своё приложение из google play Могу ли я на свое железо поставить винчестер 4 тб? Мама - ASUS 5 ke
На одно свое устройство не могу установить MYSQL Command Line 8.0 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|