2011-12-17 3 views
0

Итак, здесь я искал теоретическую проблему о том, как серверы и клиенты работают на машинах. Я знаю все процессы NET, но мне не хватает чего-то, относящегося к коду. Я не мог найти что-то связанное с этим.TCPListener/TCPClient Server-Client Чтение/чтение данных

I код в Visual C# 2008, я использую регулярные TcpClient/TcpListener с 2 различными проектами:

Project1 (Клиент)

Проект2 (Server)

Мои вопросы, может быть, так просто:

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

while (true) 
{ 

if (NetworkStream.DataAvailable) 
    { 
     //stuff 
    } 

Thread.Sleep(200); 
} 

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

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

AcceptTcpClient(); 

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

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

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

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

+0

** 1) ** 'NetworkStream.Read (buffer, ..., ...)' является блокирующим вызовом. Вам не нужен этот странный цикл while. ** 2) ** 'отправка может сломаться, если я отправлю больше данных'. Нет, вы можете безопасно использовать 'NetworkStream.Write (buffer, ..., ...)' –

ответ

1

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

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

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

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

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

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

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

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

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

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

Смежные вопросы