PDA

View Full Version : مبتدی: tcp و صفحات اینترنتی



alimooghashang
یک شنبه 22 فروردین 1389, 19:17 عصر
با سلام
من میخوام محتوی یک سایت رو با tcp بگیرم و در اون یه سری متن رو با فرمت خاصی (داخل تگ های HTML) جستجو کنم!
با تشکر

FastCode
یک شنبه 22 فروردین 1389, 19:51 عصر
System.Net.WebRequest wr = System.Net.HttpWebRequest.Create("http://www.barnamenevis.org");
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Stream rs= wr.GetResponse().GetResponseStream();
int n=-2;
while (n != -1)
{
n = rs.ReadByte();
if (n != -1)
{
ms.WriteByte((byte)n);
}
}
ms.Seek(0, SeekOrigin.Begin);

کد جایگزین برای حلقه:

while((n = rs.ReadByte()) != -1) ms.WriteByte((byte)n);

alimooghashang
چهارشنبه 25 فروردین 1389, 07:33 صبح
مرسی
چطوری این رو تبدیل به string بکنم؟
این بایت بایت میخونه، نمیشه کاری کرد خط به خط بخونه؟
مرسی

FastCode
چهارشنبه 25 فروردین 1389, 17:42 عصر
System.Net.WebRequest wr = System.Net.HttpWebRequest.Create("http://www.barnamenevis.org");
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Stream rs = wr.GetResponse().GetResponseStream();
int n;
while ((n = rs.ReadByte()) != -1) ms.WriteByte((byte)n);
ms.Seek(0, System.IO.SeekOrigin.Begin);
System.IO.StreamReader sr = new System.IO.StreamReader(ms);
string l;
while ((l = sr.ReadLine()) != null)
{
MessageBox.Show(l);
}

alimooghashang
جمعه 27 فروردین 1389, 12:15 عصر
من streamreader رو اینطوری کردم که فارسی رو بدون مشکل بخونه!!! ولی حرف ی را مشکل داره اینطوری مینویسه

س&#1740ب


StreamReader readStream = new StreamReader(rs,Encoding.Default);چکارش کنم که فارسی رو درست بگیره، اینطوری

سیب

alimooghashang
جمعه 27 فروردین 1389, 12:29 عصر
کاراکتر < رو هم اینطوری میگیره!!!

&gt

FastCode
شنبه 28 فروردین 1389, 00:33 صبح
Encoding.Unicode

alimooghashang
یک شنبه 29 فروردین 1389, 09:31 صبح
Encoding.Unicode
فقط با Encoding.Default جواب میده!!! ولی اونم حرف ی را نشون نمیده!

alimooghashang
یک شنبه 26 اردیبهشت 1389, 20:02 عصر
ببخشید چطوری میشه فهمید!، درخواستی که ارسال شده


wr.GetResponse().GetResponseStream();
چند بایت برای من از اینترنت خوانده شد!
یعنی بهتر بگم حجم صفحه ای که خواند چقدر بوده!
مرسی

eshpilen
جمعه 31 اردیبهشت 1389, 00:02 صبح
البته بنظرم باید بگی با http نه tcp.
tcp یک پروتکل لایهء بالایی اینترنت هست که فقط http بر اون بنا نشده (مثلا ftp هم بنظرم روی tcp هست).
البته بجز tcp مثلا udp هم هست و شاید پروتکل های دیگری که بنده حضور ذهن ندارم.

alimooghashang
جمعه 31 اردیبهشت 1389, 00:03 صبح
بله شما درست میگین
حالا میتونین کمک کنید؟

eshpilen
جمعه 31 اردیبهشت 1389, 08:24 صبح
سوال که ساده هست. ولی یعنی چیکار کنم مثلا تمام کدش رو بنویسم؟
باید بگم بهرصورت بنده هنوز سراغ یادگیری دات نت نرفتم متاسفانه.
سوالتون هم که همش روشنه نیازی به توضیح نیست. اول با امکانات http زبان و فریمورک مورد نظر سایت رو میگیری و بعد با امکانات مربوط به Regular Expression قسمت مورد نظر رو پیدا میکنی. بقیش هم که جزییات روزمرهء برنامه نویسیه.

alimooghashang
جمعه 31 اردیبهشت 1389, 10:15 صبح
سوال که ساده هست. ولی یعنی چیکار کنم مثلا تمام کدش رو بنویسم؟
باید بگم بهرصورت بنده هنوز سراغ یادگیری دات نت نرفتم متاسفانه.
سوالتون هم که همش روشنه نیازی به توضیح نیست. اول با امکانات http زبان و فریمورک مورد نظر سایت رو میگیری و بعد با امکانات مربوط به Regular Expression قسمت مورد نظر رو پیدا میکنی. بقیش هم که جزییات روزمرهء برنامه نویسیه.
نه دوست عزیز!
مشکل حجم اون صفحه ای هست که لود میشه!
اون مشکل قبلی حل شده

eshpilen
جمعه 31 اردیبهشت 1389, 11:36 صبح
آهان از اون لحاظ!
خب اینطور امکانات که نسبتا بدوی هستن و در هر فریمورکی معمولا پراپرتی و متدی برای مشخص کردنش هست (باید به رفرنس کتابخانهء مورد استفاده مراجعه کنید).
از طرف دیگه مثلا موقع خوندن بایت به بایت میتونید مقدار کل بایتها رو در یک متغییر ذخیره کنید.
من اگر دات نت کار بودم فوری بهت میگفتم.

alimooghashang
جمعه 31 اردیبهشت 1389, 13:04 عصر
آهان از اون لحاظ!
خب اینطور امکانات که نسبتا بدوی هستن و در هر فریمورکی معمولا پراپرتی و متدی برای مشخص کردنش هست (باید به رفرنس کتابخانهء مورد استفاده مراجعه کنید).
از طرف دیگه مثلا موقع خوندن بایت به بایت میتونید مقدار کل بایتها رو در یک متغییر ذخیره کنید.
من اگر دات نت کار بودم فوری بهت میگفتم.
من هر property که به نظرم میرسید چک کردم ولی نبود!
برای همین دوباره اینجا پرسیدم!

eshpilen
جمعه 31 اردیبهشت 1389, 14:52 عصر
حتما هست. غیرممکنه نباشه.
همون wr.GetResponse() هرچیزی برمیگردونه باید یک پراپرتی مربوط به طول داشته باشه.

alimooghashang
جمعه 31 اردیبهشت 1389, 17:08 عصر
حتما هست. غیرممکنه نباشه.
همون wr.GetResponse() هرچیزی برمیگردونه باید یک پراپرتی مربوط به طول داشته باشه.
کاشکی یکی بود به ما میگفت این کار رو چطوری میشه کرد!

eshpilen
جمعه 31 اردیبهشت 1389, 18:27 عصر
بابا منکه با یه سرچ گوگل ساده سریع پیدا کردم.
اینطوری طول رو باید بدست بیاری ظاهرا: wr.GetResponse().ContentLength

منبع: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx و http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx

alimooghashang
جمعه 31 اردیبهشت 1389, 18:31 عصر
بابا منکه با یه سرچ گوگل ساده سریع پیدا کردم.
اینطوری طول رو باید بدست بیاری ظاهرا: wr.GetResponse().ContentLength

منبع: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx و http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx
دوست عزیز ContentLength مال درخواست هایی هست که بصورت فایل به شما برگردونده میشه! مثلا jpg یا zip یا...
در مورد صفحه این مقدار -1 هست!
مثلا اگه صفحه www.google.com رو بگیری مقدارش -1 هست!

eshpilen
جمعه 31 اردیبهشت 1389, 18:48 عصر
تست کردی اصلا؟
مگه درخواست شما چطوری برگردونده میشه؟

alimooghashang
جمعه 31 اردیبهشت 1389, 18:56 عصر
تست کردی اصلا؟
مگه درخواست شما چطوری برگردونده میشه؟
بصورت زیر 49383

eshpilen
جمعه 31 اردیبهشت 1389, 19:03 عصر
آفرین که تصویرش رو گذاشتی.
کدت بنظرم باید اینطوری باشه:

MessageBox.Show(wr.GetResponse().ContentLength.ToS tring());
اونی که شما نوشتی یک قسمتش کمه.

alimooghashang
جمعه 31 اردیبهشت 1389, 19:05 عصر
آفرین که تصویرش رو گذاشتی.
کدت بنظرم باید اینطوری باشه:

MessageBox.Show(wr.GetResponse().ContentLength.ToS tring());
اونی که شما نوشتی یک قسمتش کمه.
اینطوری هم تست کردم
ولی هنوز همونه!!!
تا اونجا که من میدونم content length ماله فایله نه صفحه!!!

eshpilen
جمعه 31 اردیبهشت 1389, 19:13 عصر
ببین صفحه هم یک فایله در اصل. مثلا وقتی میزنی example.com و فایل index.html برگردونده میشه، آیا این یک فایل نیست؟
ضمنا اطلاعاتی که از سرور به اینصورت بدست میاد همش بصورت بافر/رشته ای از بایتها درنظر گرفته میشه. فرقی نمیکنه از کجا اومده باشه و اسمش چی باشه و واقعا روی سرور بشکل یک فایل بوده باشه یا نه و بصورت دینامیک یا از دیتابیس و هرمنشاء دیگری تولید شده باشه.
احتمالا مشکل از جای دیگر کار هست.
من دات نت و سی شارپ کار نکردم و امکان تست و بررسی بیشتر هم ندارم (محیطش در دستم نیست).
ولی پیشنهاد میکنم مثلا این خط خاص رو بذاری خط سوم کدهات و تست کنی.
ضمنا معنی -1 میتونه این باشه که ارتباط با موفقیت انجام نشده. معمولا معنای چنین عددی اینطور هست! اول باید به یه روشی مطمئن بشی که اصلا درخواست با موفقیت پاسخی دریافت کرده یا نه.

eshpilen
جمعه 31 اردیبهشت 1389, 19:23 عصر
بعد یه چیز دیگه الان دیدم.
در مثال سایت msdn ببین کدش چطوریه:


HttpWebResponse response = (HttpWebResponse)request.GetResponse ();

Console.WriteLine ("Content length is {0}", response.ContentLength);همونطور که میبینی از یک cast به HttpWebResponse استفاده کرده.
بنابراین با این کد هم تست کن:

MessageBox.Show(((HttpWebResponse)wr.GetResponse() ).ContentLength.ToString());
یا شاید اینطوری:

MessageBox.Show(((System.Net.HttpWebResponse)wr.Ge tResponse()).ContentLength.ToString());

eshpilen
جمعه 31 اردیبهشت 1389, 20:18 عصر
خب گفتم اول باید چک کنی ببینی اصلا پاسخی برگردونده شده یا نه. اینکار رو کردی؟

alimooghashang
جمعه 31 اردیبهشت 1389, 20:26 عصر
خب گفتم اول باید چک کنی ببینی اصلا پاسخی برگردونده شده یا نه. اینکار رو کردی؟
بله بر میگردونه دوست عزیز
و کد ها را تحلیل میکنم!
میشه خودم بشینم و اندازه رشته را بگیرم!
ولی میخوام که حجمی که از طریق ارسال و دریافت درخواست (به کیلوبایت) صفحه از اینترنت رو هم بدست بیارم که الان این صفحه که گرفت حجمش چقدر بود!

Hamishebahar
جمعه 31 اردیبهشت 1389, 20:27 عصر
سلام.
دوست من شما نمیتونی اندازه یک صفحه رو بگیری چون صفحه ها از طرف سرور به صورت متن و درخواستی که شما میکنی ارسال میشه....
برای مثال شما یا باید خط به خط حجم صفحه رو دریافت کنی یا کل صفحه رو یه دفعه درخواست و دریافت کنی.
نمیشه فهمید که حجم یک صفحه اینترنتی چقدر هست.
اگه سایز یک فایل رو میتونی بگیری چون فایل ها آپلود یا دانلود میشن.
ولی صفحه ها پست میشن.
موفق باشید.

alimooghashang
جمعه 31 اردیبهشت 1389, 20:28 عصر
سلام.
دوست من شما نمیتونی اندازه یک صفحه رو بگیری چون صفحه ها از طرف سرور به صورت متن و درخواستی که شما میکنی ارسال میشه....
برای مثال شما یا باید خط به خط حجم صفحه رو دریافت کنی یا کل صفحه رو یه دفعه درخواست و دریافت کنی.
نمیشه فهمید که حجم یک صفحه اینترنتی چقدر هست.
اگه سایز یک فایل رو میتونی بگیری چون فایل ها آپلود یا دانلود میشن.
ولی صفحه ها پست میشن.
موفق باشید.
اگه نمیشه! پس چطور بعضی مرورگرها در قسمت اطلاعات صفحه، میگه این صفحه اینقدر حجمشه!!

Hamishebahar
جمعه 31 اردیبهشت 1389, 20:30 عصر
اگه نمیشه! پس چطور بعضی مرورگرها در قسمت اطلاعات صفحه، میگه این صفحه اینقدر حجمشه!!
یک مثال بزن تا بهت بگم من الان منتظرم یک سایت با یک مرور گر بهم بگین.

alimooghashang
جمعه 31 اردیبهشت 1389, 20:44 عصر
یک مثال بزن تا بهت بگم من الان منتظرم یک سایت با یک مرور گر بهم بگین.

google.com
Mozila FireFox

5.88 KB (6,017 bytes)

Hamishebahar
جمعه 31 اردیبهشت 1389, 20:46 عصر
میشه بگید کدوم قسمته فایر فاکس حجم رو نشون میده؟
منظورتون پروگرس بار روی status قسمت پایین سمت راسته؟

eshpilen
جمعه 31 اردیبهشت 1389, 20:46 عصر
خب شما همون کد مثال MSDN رو چرا تست نمیکنی ببینی درست کار میکنه یا نه و منطقش چیه؟
http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx

alimooghashang
جمعه 31 اردیبهشت 1389, 20:56 عصر
میشه بگید کدوم قسمته فایر فاکس حجم رو نشون میده؟
منظورتون پروگرس بار روی status قسمت پایین سمت راسته؟
وقتی کاملا صفحه لود شد
کلیک راست کنید روی صفحه و بعد view page info رو بزنید

alimooghashang
جمعه 31 اردیبهشت 1389, 21:01 عصر
خب شما همون کد مثال MSDN رو چرا تست نمیکنی ببینی درست کار میکنه یا نه و منطقش چیه؟
http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx
نتیجه تست روی سایت google.com


Content length is -1
Content type is text/html; charset=ISO-8859-1
Response stream received.
<!doctype html><html><head>...
درست میگیره ولی نمیدونم چرا سایز رو اشتباه نشون میده
در صورتی که 27 کیلوبایت درخواست من دریافت کرد!!!

eshpilen
جمعه 31 اردیبهشت 1389, 21:03 عصر
هرچیزی که در جواب یک درخواست http برمیگرده یک طول داره. این خیلی ساده هست. هر دیتایی نهایتا بصورت رشته ای از بایتها میاد که طول مشخصی داره. طول این دیتا شامل حجم header ها نمیشه البته.
اگر پروتکل http رو مطالعه کنید میبینید که تمام این مفاهیم درش مشخص شدن. خیلی مواقع سرور یک هدر content-length میفرسته که حجم دیتا از قبل در اون مشخص شده، و گاهی هم به عللی این هدر فرستاده نمیشه که در اینصورت باید تمام پاسخ ابتدا دریافت بشه تا طولش مشخص بشه.
شاید موقع دانلود کردن بعضی فایلها دیده باشید که حجم کل فایل نشون داده نشده و زمان لازم برای دانلود فایل بصورت تخمین مشخص نشده. این بخاطر همون نبود هدر content-length هست.
البته ممکنه من در جزییات مثل اسم هدر مربوطه اشتباه کنم چون هدرها و انکدینگ ها و مسائل مختلفی هست.
اما بطور کلی هر دیتایی حجمی داره. و چیزی که از وب دریافت میشه حتما حجمش مشخصه. فقط بعضی وقتا باید کل اون صفحه یا فایل دانلود بشه تا حجمش مشخص بشه. معمولا این درمورد فایلهای استاتیک کمتر انتظار پیش آمدن داره چون حجم این فایلها از پیش بر روی سیستم فایل مشخص هست. اما ظاهرا بعضی وقتا به عللی که نمیدونم چیه وب سرور طوری پیکربندی شده که یا به هر علت دیگری حجم فایل رو در هدر ارسال نمیکنه.

Hamishebahar
جمعه 31 اردیبهشت 1389, 21:10 عصر
وقتی کاملا صفحه لود شد
کلیک راست کنید روی صفحه و بعد view page info رو بزنید
خوب این که دیگه کاری نداره.
حجم فایل دانلودی رو نمی تونی بدست بیاری؟

Hamishebahar
جمعه 31 اردیبهشت 1389, 21:13 عصر
System.Net.WebRequest wr = System.Net.HttpWebRequest.Create("http://www.google.com");
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Stream rs = wr.GetResponse().GetResponseStream();
int n;
while ((n = rs.ReadByte()) != -1) ms.WriteByte((byte)n);
ms.Seek(0, System.IO.SeekOrigin.Begin);
System.IO.StreamReader sr = new System.IO.StreamReader(ms);
string l = sr.ReadToEnd();
MessageBox.Show(l.Length.ToString());

eshpilen
جمعه 31 اردیبهشت 1389, 21:17 عصر
نتیجه تست روی سایت google.com


Content length is -1
Content type is text/html; charset=ISO-8859-1
Response stream received.
<!doctype html><html><head>...درست میگیره ولی نمیدونم چرا سایز رو اشتباه نشون میده
در صورتی که 27 کیلوبایت درخواست من دریافت کرد!!!
دقیقا همین کد رو به همون روشی که تست کردی روی یک فایل بقول خودت مثلا jpg هم تست کن ببین جوابش همون -1 هست یا نه.
ضمنا بجز گوگل روی سایتهای دیگری هم تست کن.
اگر جواب در همه حال حتی برای فایلهای استاتیک -1 باشه کد باید بدون اشکال باشه به احتمال زیاد و مشکل از جای دیگری هست. چون قرار نیست کد مثال رفرنس رسمی، یک عدد بی معنا رو هربار برگردونه. میشه گفت خود این عدد داره یه چیزی رو میگه (که اشکالی در جایی از کار هست).

alimooghashang
جمعه 31 اردیبهشت 1389, 21:32 عصر
مرسی این کد را میشه استفاده کرد! و داره درست حساب میکنه حجم صفحه رو!
ولی نمیدونم چرا bandwidth monitor دو برابر نشون میده ترافیکی که دریافت شد!!

eshpilen
جمعه 31 اردیبهشت 1389, 21:53 عصر
مرسی این کد را میشه استفاده کرد! و داره درست حساب میکنه حجم صفحه رو!
ولی نمیدونم چرا bandwidth monitor دو برابر نشون میده ترافیکی که دریافت شد!!
ترافیک دریافت شده شامل حجم هدرها و هر اطلاعات احتمالی دیگری که جزیی از حجم محتوای موثر دریافت شده نیست هم میشه. البته فکر نمیکنم خیلی زیاد باشه.
اگر یک سایتی رو دریافت کنید که حجم متن زیادی داره احتمالا این افزایش حجم باید به نسبت حجم فایل دریافتی خیلی کمتر بشه.

alimooghashang
جمعه 31 اردیبهشت 1389, 22:23 عصر
ترافیک دریافت شده شامل حجم هدرها و هر اطلاعات احتمالی دیگری که جزیی از حجم محتوای موثر دریافت شده نیست هم میشه. البته فکر نمیکنم خیلی زیاد باشه.
اگر یک سایتی رو دریافت کنید که حجم متن زیادی داره احتمالا این افزایش حجم باید به نسبت حجم فایل دریافتی خیلی کمتر بشه.
خوب نمیشه بگیم فقط صفحه را بیاره! هدر نیاز نداریم :لبخند:
با PHP میشه این کار رو کرد! با C# هم باید بشه

eshpilen
جمعه 31 اردیبهشت 1389, 23:10 عصر
کدوم کار رو میگی؟ هدرها همیشه ارسال میشن.
تنها در روش HEAD هست که اونم بعکسه یعنی هدرها ارسال میشن اما بدنهء دیتا ارسال نمیشه.
راستی اون روشی که دوست عزیز گفتن درسته کار میکنه اما خیلی روش ناخوشایند و غیربهینه ایه. بهتره بگردی ببینی اشکال کجای کاره و راه اصولی و استانداردش رو استفاده کنی.