TCP-клиент не получает ответ по обратной связи - PullRequest
0 голосов
/ 26 февраля 2012

У меня TCP-сервер запущен и работает на localhost vs2010 на windows 2k8.

Когда я подключаю клиента на 127.0.0.1 с использованием vs2010, сервер получает вызов (я вижу это из отладки), поскольку сервер tcp выполняет обработчик протокола командной строки, но клиент действительно получает серверответ, который является ключом сеанса, но блокируется на клиенте при чтении потока ответа.

Когда я использую Telnet по шлейфу для того же порта, отправляя ту же последовательность команд, ответ, то есть ключ сеанса, принимается мгновенно.

Вот код клиента:

EndPoint serverAddress = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9121);
sing (Socket socket = new Socket(serverAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
            {

                socket.Connect(serverAddress);

                var socketStream = new NetworkStream(socket);
                var reader = new StreamReader(socketStream, Encoding.ASCII, false);
                var writer = new StreamWriter(socketStream, Encoding.ASCII, 1024);

                string charSource = Guid.NewGuid().ToString().Replace("-", string.Empty)
                   + Guid.NewGuid().ToString().Replace("-", string.Empty)
                   + Guid.NewGuid().ToString().Replace("-", string.Empty);

                Random rd = new Random();


                int startPos = rd.Next(0, charSource.Length - 2);
                int endPos = rd.Next(startPos + 1, charSource.Length - 1);

                var currentMessage = charSource.Substring(startPos, endPos - startPos + 1);

                Console.WriteLine("Sent Command");

                writer.Write("HEAR {0} {1}", currentMessage.Length.ToString().PadLeft(4, '0'), currentMessage);
                writer.Flush();

                Console.WriteLine("Reading Command Results");
                var line = reader.ReadLine();
                Console.WriteLine("Received: " + line);
            }

Боб

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Чтобы это работало, измените Write с WriteLine, как показано в коде ниже:

 Console.WriteLine("Sent Command");

 writer.WriteLine("HEAR {0} {1}", currentMessage.Length.ToString().PadLeft(4, '0'), currentMessage);
 writer.Flush();
2 голосов
/ 02 марта 2012

Включить трассировку сети , чтобы вы могли быть уверены, что данные поступают. Вероятно, так и есть, поэтому измените ваш вызов на reader. Читайте и читайте, пока не найдете конец сообщения.

...