TCPListener / TCPClient Сервер-Клиент Запись / Чтение данных - PullRequest
0 голосов
/ 17 декабря 2011

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

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

Project1 (Клиент)

Project2 (сервер)

Возможно, мои проблемы настолько просты:

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

while (true)
{

if (NetworkStream.DataAvailable)
    {
        //stuff
    }

Thread.Sleep(200);
}

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

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

AcceptTcpClient();

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

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

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

Возможно ли это?

1 Ответ

1 голос
/ 17 декабря 2011

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

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...