2016-04-08 2 views
0

я не могу получить этот пример для запуска: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspxNetworkStream.Read не проливает исключения

Единственного Ive изменился с их кодом поместить все в основном методе, и мое имя порта, конечно. Я могу подключиться к своему серверу и даже отправлять данные. Но на линии

Int32 bytes = networkStream.Read(data, 0, data.Length); 

Программа перестает работать без каких-либо исключений. Как собственный код Microsoft не работает? Мой сервер еще ничего не отправляет, но я не думаю, что это важно? (Это прекрасно получается.) Ive Прочитайте то, что вы не можете исключить из других потоков, но у меня их нет. Я также пробовал эту тему: C# tcp socket (networkstream.read won't work with 8.1)

Это не работает. Я побеждаю 7 тугух. Но я хочу, чтобы это работало во всех новых окнах.

+0

Прочитано - синхронный звонок. Что вы отправляете с сервера? – Nemo

+1

Read() будет блокировать/останавливаться, ожидая получения некоторых данных. В качестве обхода этой блокировки вы можете добавить 'if (networkStream.IsDataAvailable)' перед чтением. Таким образом, он никогда не должен блокироваться. –

+0

@ThariqNugrohotomo и что, если он возвращает false? Это не значит, что нет данных! IsDataAvailable не работает для этого. – usr

ответ

2

NetworkStream.Read блокируется до тех пор, пока данные не будут доступны, соединение будет закрыто (в этом случае оно вернет 0) или возникает исключение. Он разработан таким образом.

Если ваш сервер отправит данные, ваша клиентская программа продолжит работу и сможет обработать ответ.

+0

Быть может. Я должен сказать очень странное поведение. Кажется, что изменение этой команды также изменилось, потому что старые примеры онлайн все используют что-то вроде чтения в их цикле while. Теперь я должен использовать что-то наподобие while (stream.dataavailble), а затем читать внутри цикла while. –

+0

@StaffanMattsson: изменений в исполнении нет. Примеры имеют 'Read()' в цикле, потому что они, вероятно, могут позволить себе блок (т. Е. Он находится в другом потоке). Это всегда было блокирование, если я не ошибаюсь. –

+0

@StaffanMattsson: Это даже указано в документации 'NetworkStream.Read()' еще в .NET Framework 1.1, что _ ** «Если для чтения нет данных, метод NetworkStream.Read будет блокироваться до тех пор, пока не будут доступны данные. «** _. Ссылка: https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read(v=vs.71).aspx –

0

NetworkStream.Read() - синхронный вызов, он будет ждать получения ответа. Чтобы читать данные разной длины, вы можете сделать что-то вроде ниже.

ПРИМЕЧАНИЕ. Я предполагаю, что сервер отправляет только один ответ для запроса.

private string GetResponse(string command) 
{ 
    //Send request 
    TcpClient client = new TcpClient(HOST, PORT); 
    Byte[] data = Encoding.ASCII.GetBytes(command); 
    NetworkStream stream = client.GetStream(); 
    stream.Write(data, 0, data.Length); 

    //Read response 
    data = new Byte[BUFFER_SIZE]; 
    String response = String.Empty; 
    stream.ReadTimeout = READ_TIMEOUT; 
    while (!response.EndsWith(RESPONSE_END)) 
    { 
     int bytes = stream.Read(data, 0, data.Length); 
     response += Encoding.ASCII.GetString(data, 0, bytes); 
    } 
    response = response.Remove(response.Length - RESPONSE_END.Length); 
    stream.Close(); 
    client.Close(); 

    //Return 
    return response; 
} 
+0

У этого есть ошибка, потому что он может читать несколько сообщений за раз, или одно сообщение плюс частичное. – usr

+0

@usr Истинно, если несколько ответов отправляются сервером. В этом примере я предполагаю, что сервер отправляет только один ответ для запроса. – Nemo

+0

Правильно, я не думал об этой возможности. – usr

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