powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите разобрать StreamReader? Зависает...
13 сообщений из 13, страница 1 из 1
Помогите разобрать StreamReader? Зависает...
    #35226939
helloword
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполняю HTTP запрос:
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);

wr.Timeout = 50000;

WebResponse resp = wr.GetResponse();
Encoding encode = System.Text.Encoding.GetEncoding("Windows-1251");
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream, encode);
if (sr.EndOfStream) break;

string ret = "";

while (true)
{
string s = sr.ReadLine();
if(s==null) break;
ret += s;
}
//ret = sr.ReadToEnd();

Проблема в том что sr.ReadLine(); в цикле иногда зависает намертво (ну или sr.ReadToEnd();)
на ооочень долгий срок, после этого отвисает с сообщение по таймауту но у StreamReader вроде нет таймаута? как этого избежать? и почему он зависает?
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #35227075
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helloword... но у StreamReader вроде нет таймаута? как этого избежать? и почему он зависает?
Скорее всего "зависает" канал связи, попробуйте читать "порциями", а не строчками:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
    int buffersize = 256;
    Char[] buffer = new Char[buffersize];
    int count = stream.Read(buffer, 0, buffersize);
    Console.WriteLine();
    while (count > 0) 
        {
            String str = new String(buffer, 0, count);
            Console.Write(str); // или Debug.Write(str);
            count = stream.Read(buffer, 0, buffersize);
        }
...
заодно и выясните (с точностью до размера буфера) - в какой момент передача данных "виснет" до тайм-аута соединения... (если на сервере реализован буферизованный вывод, то вполне возможно, что он там "впадает" в бесконечный цикл и на клиенте конца передачи вы уже не дождетесь).
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #35227105
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь не то. Канал "работает" на WebResponse resp = wr.GetResponse();
После этого ответ на запрос уже на клиенте. У меня написано вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
				Stream s = resp.GetResponseStream ( );
				if ( s == null ) return null;

				MemoryStream ms = new MemoryStream ( );
				while ( true )
				{
					int i = s.ReadByte ( );
					if ( i == -1 ) break;
					ms.WriteByte ( ( byte ) i );
				}
				s.Close ( );
Как видно, я читаю побайтно. Когда нужна строка, делаю вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
				byte [ ] b = new byte [ ms.Length ];
				ms.Position = 0;
				ms.Read ( b, 0, ( int ) ms.Length );
				ms.Close ( );
			Encoding e = Encoding.UTF8;
			string stmp =  e.GetString ( b );
Проблем не замечал.
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #35227113
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu
+1
ReadLine - читает до конца строки, а этот конец - это два символа "line feed" и "carrige return"
в бинарном виде 10 и 13 (если не перепутал)
Если их не будет - StreamReader будет их ждать.

то есть, использовать ReadLine можно только по отношению к гарантированно правильно отформатированному текстовому файлу.
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #35227555
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagner забывший парольЗдесь не то. Канал "работает" на WebResponse resp = wr.GetResponse();
После этого ответ на запрос уже на клиенте...
Э-хе-хе, ну зачем вы говорите всегда то, в чем не до конца разобрались?
Зачем тогда, по-вашему, в HttpWebResponse сделана "потоковая модель" обмена данными?
Что, по-вашему, должен "поточить" GetResponseStream() если все данные в нем "приходят" за 1 раз и целиком?
Попробуйте сделать вот это (и полюбуйтесь на консольный вывод):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
// get-http-response.cs
using System;
using System.IO;
using System.Net;

public class Script {
	public static void Main (string[] args) {
		if (args == null || args.Length < 1) {
			Console.WriteLine ("Usage: prog_name \"<http_URL>\"");
			return;
		}
		try {
			GetWebResponse (args[0]);
		}
		catch (Exception ex) {
			Console.WriteLine (ex.ToString());
		}
	}

	protected static void GetWebResponse (string url) {
		WebRequest request = WebRequest.Create (url);
		using (HttpWebResponse response = (HttpWebResponse)request.GetResponse ()) {
			Console.WriteLine (response.StatusDescription);
			using (StreamReader reader = new StreamReader (response.GetResponseStream ())) {
				int buffersize = 8;
				char[] buffer = new char[buffersize];
				int count = reader.Read(buffer, 0, buffersize);
				while (count > 0) {
					Console.Write (new String(buffer, 0, buffersize));
					Console.WriteLine ("PreBufferRead");
					count = reader.Read(buffer, 0, buffersize);
					Console.WriteLine ("PostBufferRead");
				}
			}
		}
	}
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<!-- buffered-write.asp -->
<%@ language="JScript" %>
<%
Response.Buffer = true;

for (var i =  0 ; i <  5 ; i++) {
	for (var j =  0 ; j <  10000000 ; j++) {}
	Response.Write("Step:" + i + "\r\n");
	Response.Flush();
}
Response.End();
%>
Console
> get-http-response.exe http://localhost/buffered-write.asp
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #35227723
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доверюсь Вам без запуска предложенного кода. Если честно - у меня такое впечатление сложилось чисто от хождения дебагером по строчкам, респонс ждал долго а потом все быстро проскакивало.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Помогите разобрать StreamReader? Зависает...
    #39028581
orl412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qu-qu, здравствуйте. У меня также возникла данная проблема. Хотел воспользоваться вашим решением. Но в этой строчке:
Код: c#
1.
int count = stream.Read(buffer, 0, buffersize);


ругается на то, что Read не может читать char[]. Ему байты подавай. Не подскажите как это исправить?
Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #39028665
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orl412,
buffer - какого типа? Нужно byte[]
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #39028708
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orl412,

а нафига вообще читать в char[]?
char[] по сути и так является байтом и имеет соответствующие методы преобразования типа из одного типа в другой на базе интерфейса IConvertible
у char
Код: c#
1.
2.
3.
4.
    byte IConvertible.ToByte(IFormatProvider provider)
    {
      return Convert.ToByte(this);
    }


у byte
Код: c#
1.
2.
3.
4.
    char IConvertible.ToChar(IFormatProvider provider)
    {
      return Convert.ToChar(this);
    }


читайте в байтах и преобразовывайте в символы, кто вам мешает?
только 1 не понятно, нафига это вообще нужно.
Для чтения и записи в файл существуют более удобные способы, не требующие работать с потоком напрямую. Не думаю, что у вас задача настолько тонкая, что в этом есть необходимость.
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #39028771
orl412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, читаем не из файла, а с GetResponse, то есть ответ от сервера. Иногда читается нормально, иногда виснет.
Вообще, я делаю это так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
Stream stream2 = resp.GetResponseStream();
using (StreamReader stream = new StreamReader(stream2, Encoding.UTF8))
{
bodyResp = stream.ReadToEnd();
//					stream.Close();
//				}
				resp.Close();
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #39028778
orl412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, нечаянно отправилось.
В общем я делаю это так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
Stream stream2 = resp.GetResponseStream();
using (StreamReader stream = new StreamReader(stream2, Encoding.UTF8))
{
      bodyResp = stream.ReadToEnd();
      stream.Close();
}
resp.Close();



Но, видимо, нужно читать побуферно. Переделал так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Stream stream1 = resp.GetResponseStream();
int buffersize = 256;
Byte[] buffer = new Byte[buffersize];
int count = stream1.Read(buffer, 0, buffersize);
while (count > 0) 
{
      String str = new String(buffer.ConvertTo<char[]>(), 0, count);
      count = stream1.Read(buffer, 0, buffersize);
      bodyResp += str;
}
stream1.Close();



Так тоже не работает. buffer, думаю, надо все-таки в чарах держать, но stream не умеет чары читать.
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #39028796
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejteschar[] по сути и так является байтом
char занимает два байта, но это деталь реализации на которую не стоит полагаться.

Roman Mejtesмеет соответствующие методы преобразования типа из одного типа в другой на базе интерфейса IConvertible
Преобразование byte[] <-> string следует выполнять с помощью класса Encoding. Методы IConvertible сработают только для ограниченного набора символа из кодировки ASCII.
...
Рейтинг: 0 / 0
Помогите разобрать StreamReader? Зависает...
    #39028902
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileRoman Mejteschar[] по сути и так является байтом
char занимает два байта, но это деталь реализации на которую не стоит полагаться.

Roman Mejtesмеет соответствующие методы преобразования типа из одного типа в другой на базе интерфейса IConvertible
Преобразование byte[] <-> string следует выполнять с помощью класса Encoding. Методы IConvertible сработают только для ограниченного набора символа из кодировки ASCII.
ну это зависит от того, что и во что он преобразует, так сказать вопрос реализации.
Если автор получает Respone от сервера, то там скорее всего некий XML или JSON, который можно спокойно сериализовать без лишних проблем.
Если сервер просто возвращает всякие строки, то для чтения из потока есть всякие StringReader'ы и другие классы, облегчающие чтение из потока, без всяких побайтных чтений
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите разобрать StreamReader? Зависает...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]