TCP-клиент не получает ответ на петлю

У меня есть TCP-сервер, работающий на локальном хосте на 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);
            }

Боб


person scope_creep    schedule 26.02.2012    source источник
comment
Мы никогда не сможем ответить на это. Но мы могли бы, если вы покажете соответствующий код.   -  person nos    schedule 26.02.2012
comment
Вам не хватает информации в вопросе. Может быть дюжина переменных, влияющих на ваш отсутствующий ответ. Как мы можем догадаться?   -  person Jason    schedule 26.02.2012
comment
Да, это то, что я понял. Выложу код клиента.   -  person scope_creep    schedule 26.02.2012
comment
Вы отправляете cr и/или lf, которые ожидает ReadLine()?   -  person 500 - Internal Server Error    schedule 29.02.2012
comment
Если вы собираетесь читать строки, вам нужно и писать строки.   -  person David Schwartz    schedule 29.02.2012
comment
Не отправлять cr/lf намеренно. Команда имеет формат ‹Command› ‹DataLength› ‹Data›, например. HEAR 0004 jssa, HEAR — это команда CLP для подтверждения. Протестировал сервер с помощью TCPBuilder, который является тестером сокетов, и сервер работал нормально. В этом глупом коде чего-то не хватает.   -  person scope_creep    schedule 01.03.2012


Ответы (2)


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

 Console.WriteLine("Sent Command");

 writer.WriteLine("HEAR {0} {1}", currentMessage.Length.ToString().PadLeft(4, '0'), currentMessage);
 writer.Flush();
person ogggre    schedule 29.02.2012
comment
Пробовал установить оба на WriteLine. Клиент сидит и ждет. Наверняка флеш записывает буферный поток в канал. - person scope_creep; 01.03.2012
comment
Я скачал построитель TCPIP, и сервер работает нормально. Вы рекомендуете какие-либо примеры клиентов сокетов .NET TCP/P. - person scope_creep; 01.03.2012
comment
Я создал клиента, используя класс TcpClient, который работал нормально. Сервер работает и отправляет правильный ответ сеанса. - person scope_creep; 01.03.2012
comment
Окончательное решение состояло в том, чтобы добавить новую строку в ответ сеанса. После этого клиент заработал нормально и обнаружил, что тестовый код проходит, но неверно. Спасибо. - person scope_creep; 02.03.2012

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

person Fernando    schedule 01.03.2012
comment
Спасибо за это. Не видел его раньше. - person scope_creep; 02.03.2012