TCPListener/TCPClient Сервер-клиент Запись/Чтение данных

Здесь я устраняю теоретическую проблему о том, КАК серверы и клиенты работают на машинах. Я знаю все процессы NET, но мне не хватает чего-то, относящегося к коду. Я не смог найти что-то связанное с этим.

Я кодирую в Visual C# 2008, я использую обычный TCPClient/TCPListener с двумя разными проектами:

Проект1 (Клиент)

Проект2 (сервер)

Мои проблемы могут быть такими простыми:

1-> О том, как сервер получает данные, возможны ли обработчики событий? В моих первых серверных кодах я использовал этот цикл:

while (true)
{

if (NetworkStream.DataAvailable)
    {
        //stuff
    }

Thread.Sleep(200);
}

Я сталкиваюсь с этим как с дерьмовым способом контролировать входящие данные с сервера. НО сервер всегда готов к приему данных.

Мой вопрос: Есть что-нибудь вроде...? ->

AcceptTcpClient();

Мне нужен обработчик, который ждет, пока что-то не произойдет, в данном случае получение данных определенного сокета.

2-> Общие сетевые методы ввода-вывода.

Проблема (кроме того, что я нуб) заключается в том, как обрабатывать множественную запись данных. Если я использую для отправки много данных в массиве байтов, отправка может прерваться, если я отправлю больше данных. Все данные слились и при приеме возникают ошибки. Я хочу обрабатывать несколько записей для отправки и получения.

Это возможно?


person Sergio Valle    schedule 17.12.2011    source источник
comment
1) NetworkStream.Read(buffer,...,...) — это блокирующий вызов. Вам не нужен этот странный цикл while. 2) the sending can break if I send more data. Нет, вы можете безопасно использовать NetworkStream.Write(buffer,...,...)   -  person L.B    schedule 17.12.2011


Ответы (1)


О том, как сервер получает данные, возможны обработчики событий?

Если вы хотите написать серверный код, ориентированный на обратный вызов, вы можете найти в MSDN асинхронный сокет сервера. Пример именно то, что вы ищете.

... отправка может прерваться, если я отправлю больше данных. Все данные слились и при приеме возникают ошибки.

Такова природа TCP. Стандартизированные интернет-протоколы делятся на несколько категорий:

             block oriented    stream oriented
reliable          SCTP              TCP
unreliable         UDP              ---

Если вы действительно хотите отправлять блоки данных, вы можете использовать SCTP, но имейте в виду, что многие брандмауэры DROP SCTP-пакеты, потому что они не являются «обычными». Я не знаю, сможете ли вы надежно маршрутизировать пакеты SCTP через открытый Интернет.

Вы можете обернуть свой собственный контент в блоки данных со своими собственными заголовками или добавить в свою систему другие механизмы «синхронизации». Рассмотрим HTTP-сервер: он должен ждать, пока не прочитает запрос целиком, например:

GET /index.html HTTP/1.1␍␊
Host: www.example.com␍␊
␍␊

Пока сервер не увидит последовательность CRLFCRLF, он должен хранить частично прочитанные данные в буфере. Байты могут поступать по одному в дюжине или более пакетах. Или, если клиент отправляет несколько запросов в одном потоке, дюжина запросов может прийти в одном пакете.

Вы просто должны справиться с этим.

person sarnold    schedule 17.12.2011