Во-первых, рекомендация: по моему опыту, TcpClient лучше всего использовать асинхронно.
При всем моем использовании TcpClient я никогда не мог прочитать ответ, не выполнив сначала запись с запросом. Вы навсегда заблокируете попытку синхронно ожидать ответа на запрос, который вы не отправили.
На этом основывается отправка запроса:
TcpClient.GetStream().BeginWrite( tcpMessage, ... );
, который отправит запрос, который находится в tcpMessage, который будет являться байтовым потоком, полученным из строки, подобной этой:
byte[] tcpMessage = httpEncoding.GetBytes( httpMessage );
Которое имеет ваше сообщение-запрос:
httpMessage = "GET / HTTP/1.1\r\n" + ...;
Это отправляет ваш запрос, который заставляет сервер генерировать ответ, который вы можете затем собрать следующим образом:
TcpClient.GetStream().BeginRead( ... );
И вы наконец-то сможете получить что-то обратно!
Даже если это всего лишь "Мне не понравился твой запрос!" ответ. 8 Д