PDA

View Full Version : راهنمایی برای استفاده از Threading در socket programing ؟!



Heidari66
شنبه 31 مرداد 1394, 15:15 عصر
سلام

یه برنامه سمت سرور نوشتم که از طریق پورت دیتای حدود 100 بایتی رو از حدود 100تا کلاینت دریافت میکنه و داخل دیتابیس Mysql میریزه.
کلاینتها دیتارو هر 10 دقیقه میفرستن یعنی یک کلاینت 100بایت دیتارو میفرسته و دوباره 10 دقیقه بعد تکرار میکنه.
حالا بنظر شما نیازی به Threading تو برنامه ای که نوشتم هست؟!
اینو میپرسم چون یک کلاینت وقتی دیتارو فرستاد ارتباطش با سرور قطع میشه تا ده دقیقه بعد دوباره سعی به ارتباط مجدد و ارسال دیتا میکنه.

ممنون

Heidari66
یک شنبه 01 شهریور 1394, 07:01 صبح
کسی نبوووووود

elyas_delshadnbe
یک شنبه 01 شهریور 1394, 08:17 صبح
سلام
کلاینت ها همزمان با هم داده ها رو ارسال می کنن؟
به نظرم کلا نیاز نیست
من ی برنامه داشتم که همزمان 4 تا کلاینت 100.000 داده 32.000 بایتی رو میفرستادن و سرور تمام و کمال همه رو دریافت می کرد.
از تردینگ لازم نیست استفاده کنی. من تو برنامم فک کنم دوتا ترد داشتم ک یکی واسه اعمال فورم بود و یکی واسه جمع کردن داده ها

Heidari66
یک شنبه 01 شهریور 1394, 10:13 صبح
بله کلاینتها تقریبا همزمان داده ها رو ارسال میکنن

وقتی از تردینگ استفاده میکنم و حجم زیادی دیتا رو بصورت مجازی میفرستم بعد از چندلحظه خطا میده و سرویس استاپ میشه
ولی وقتی استفاده نمیکنم مشکلی نداره سرویس به راحتی کار میکنه ولی وقتی حجم دیتا زیاد میشه سرعتش هم میاد پایین

سوالم اینه که تردینگ معمولا کجا استفاده میشه ، اونجور که بنظر میاد باید کلاینت برای مدتی به سرور ارتباط داشته باشه تا لازم باشه از تردینگ استفاده کنیم مثل برنامه چت
ولی کلاینت من یه لحظه به سرور وصل میشه و دیتارو میفرسته و مجدد ارتباطش قطع میشه
بنظر خودم هم نیازی به تریدینگ نیست
درست میگم؟

elyas_delshadnbe
یک شنبه 01 شهریور 1394, 12:02 عصر
اهااااااااااااااااااا
میدونی مشکل کارت کجاس؟
منم این مشکلو داشتم
1. تو هر بار که یه کلاینت میخاد به سرور وصل بشه میای واسش یه ترد جدید ایجاد میکنی و وقتی اون کلاینت دیسکانکت میشه احتمالا به خوبی تردشو مدیریت نمیکنی و حذفش نمیکنی و اینه که تردات بعد یه مدت خیلی زیاد میشن و سرویست استاپ میشه.درست میگم؟
2. چرا کلاینتو دیسکانکت میکنی؟ بذار باشه عوض delay بذار تا هر 10 دقیقه داده بفرسته

elyas_delshadnbe
یک شنبه 01 شهریور 1394, 12:05 عصر
تو حجم داده هات که از من بیشتر نبوده دیگه؟من تو آزمایشام حتی با 9 سیستم همزمان 100.000 داده 32.000 بایتی رو فرستادم هر چند کامل جواب نمیداد ولی سرویس هیچکدوم استاپ نشد.نه سرور و نه کلاینت. بعدم یه نکته دیگه؟ از پروتکل UDP استفاده میکنی یا TCP؟

hamid_hr
یک شنبه 01 شهریور 1394, 12:14 عصر
اگه میشه کد اتصال و دریافت سمت سرور رو بزارببینیم شاید مشکلت رو بشه حل کرد

Heidari66
یک شنبه 01 شهریور 1394, 21:29 عصر
اهااااااااااااااااااا
میدونی مشکل کارت کجاس؟
منم این مشکلو داشتم
1. تو هر بار که یه کلاینت میخاد به سرور وصل بشه میای واسش یه ترد جدید ایجاد میکنی و وقتی اون کلاینت دیسکانکت میشه احتمالا به خوبی تردشو مدیریت نمیکنی و حذفش نمیکنی و اینه که تردات بعد یه مدت خیلی زیاد میشن و سرویست استاپ میشه.درست میگم؟
2. چرا کلاینتو دیسکانکت میکنی؟ بذار باشه عوض delay بذار تا هر 10 دقیقه داده بفرسته


تو برنامه ای که با ترد هست هر ثانیه چک میکنه و تردهای غیراستفاده رو حذف میکنه.
برنامه سمت کلاینت چون یه دستگاه هست از دسترس من خارج هست یعنی برنامه نویسیش دست من نیست که تغییر بدم.
همچنین دیتاهای من خیلی مهمه نمیخوام هیکدومش از بین بره.







اگه میشه کد اتصال و دریافت سمت سرور رو بزارببینیم شاید مشکلت رو بشه حل کرد


بفرما اینم از کد ، شرمنده با vb نوشتم :

hamid_hr
دوشنبه 02 شهریور 1394, 09:04 صبح
شما بعد از اتصال کلاینت کد ها رو تو یه تابع بنویسین بعد اون تابع رو با ترد اجرا کنید
data = Nothing Dim stream As NetworkStream = client.GetStream()
Dim i2 As Int32
i2 = stream.Read(bytes, 0, bytes.Length)


data = System.Text.Encoding.ASCII.GetString(bytes, 0, i2)
'Console.WriteLine(data)


Try



Dim sqlCon As New MySqlConnection("server=localhost;user id=root ;password= ;database=db;")
Dim sqlCmd As New MySqlCommand




sqlCmd.CommandText = "INSERT INTO " & tbl & " (s1, s2, s3, s4, s5, s6, t1, t2) VALUES ( ?x0, ?x1, ?x2, ?x3, ?x4, ?x5, ?x6, ?x7)"




sqlCon.Open()
sqlCmd.ExecuteNonQuery()




sqlCmd.Dispose()
sqlCon.Close()
sqlCon.Dispose()

اینها رو بریزید تو یه تابع که ورودیش از نوع TcpClient باشه و اون تابعو با ترد اجرا کنید

elyas_delshadnbe
دوشنبه 02 شهریور 1394, 10:11 صبح
کلا اگه بخای با TCP کار کنی و همه داده ها هم برات مهم هستن به نظرم سرعتت میاد پایین و کند شدن برنامه نباید برات تعجب آور باشه