سلام
در دات نت هر کاری که عشقتان میکشد میتوانید انجام دهید، رایانه در خدمت شما است، از بیخ و بن!
چت میخواهید بسازید؟
سلام
در دات نت هر کاری که عشقتان میکشد میتوانید انجام دهید، رایانه در خدمت شما است، از بیخ و بن!
چت میخواهید بسازید؟
سلام
آخرش هم بلای من سرت در می آید و دیپلمه میمونی! فقط من اون موقع که جوون بودم(!) شب امتحانام میشستم کتابهای الکترونیک میخوندم.
بشین درس بخوان ، مگو چیست نمره، که سرمایه جاودانه است مدرک! (البته بعد از پارتی!)![]()
ممنون از جوابت
حالا میشه با جزئیات بیشتر توضیح بدید؟
دارم اونی که دادی رو می خونم. ولی شما هم لطف کن این سوالات آخرم رو یه جوابی بده.
مرسی
----
از کجا فهمیدی؟چت میخواهید بسازید؟![]()
Last edited by dogtag; 26-06-2008 at 16:53.
سلام
میبخشید طول کشید، زیاد حال و حوصله .... سعی کردم متدهای کلیدی و اصلی را تشریح کنم.
ولی با هر متد دیگری هم مشکل داشتید، مشکلی نیست! بپرسید..
ضمناً یک کم کد را تغییر دادم، در حد چند خط، پیشنهاد میکنم، مجدداً آخرین نسخه را دانلود کنید.
- کلاس System.Net.Sockets.Socket
اصلی ترین کلاسس مبنا جهت مدیریت سوکت ها است.
- کلاس System.Net.Sockets.TcpClient
یک سوکت را باز کرده و برای کار تحت پروتکل TCP/IP و به صورت کلاینت مهیا میکند.
متد شروع کار Connect
متد پایان کار Close
خصوصیتی که سوکت را برمیگرداند هم Client است
- کلاس System.Net.Sockets.TcpListener
یک سوکت را باز کرده و برای کار تحت پروتکل TCP/IP و به صورت سرور مهیا میکند.
متد شروع کار Start
متد پایان کار Stop
خصوصیتی که سوکت را برمیگرداند هم Server است
==============================
System.Net.Sockets.Socket
متد Receive جهت دریافت اطلاعات، با ریسمان جاری و به صورت بلوکه شده میباشد.
متد BeginReceive جهت دریافت اطلاعات، به صورت غیر همزمان و غیر بلوکه شده است.
متد Send جهت ارسال اطلاعات، با ریسمان جاری و به صورت بلوکه شده میباشد.
متد BeginSend جهت ارسال اطلاعات، به صورت غیر همزمان و غیر بلوکه شده است.
پارامترهای یکی از Overload های متد BeginReceive و Send را که در برنامه نمونه استفاده شده در زیر بررسی میکنیم، Receive و BeginSend هم همین پارامترها را دارند.
Send==========
این Overload متد Send، فقط یک آرایه بایتی میگیرد و آن را ارسال میکند، همه اطلاعات دیگر را باید به آرایه ای از بایتها تبدیل کرد؛ که در کد نمونه ما متن را با متد System.Text.Encoding.UTF8.GetBytes تبدیل کردیم.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
BeginReceive==========
- پارامتر buffer یک بافر را برای ریختن اطلاعاتی دریافتی در آن تحویل متد BeginReceive میدهد.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
- پارامتر offset نقطه شروع و size تعداد بایتهایی را مشخص میکند که متد BeginReceive اجازه دارد از buffer استفاده کند، در حالت عادی، offest صفر است و size همان مقدار گنجایش buffer است، یعنی متد مذکور میتواند از کل buffer استفاده کند.
- پارامتر socketFlags یک سری پرچم های بیتی را برای سوکت تنظیم میکند که معمولاً مقدار None کفایت میکند.
- پارامتر callback هم یک اشاره گر یا handler از تابعی است که باید در زمان اتمام دریافت، اجرا شود، میتوانید آن را مثل رویداد Click یک دکمه فرض کنید، یعنی هر زمان داده ای دریافت شود، این این متد اجرا شود.
در VB میتوان handler تابع یا به قول دات نت Delegate یک تابع را با دستور AddressOf به دست اورد.
این handler باید امضای AsyncCallback را داشته باشد، یعنی باید با کدی مشابه زیر تعریف شوده باشد.
پارامتر state بیشتر حالت اختیاری دارد و البته بسیار مفید است، این پارامتر یک مقدار را میگیرد، هر چه خواستید، یک Integer یا یک String یا هر Object دیگری و هیچ کاری با این مقدار انجام نمیدهد!!!!کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
وقتی کار دریافت اطلاعات تمام شد، و تابع callback اجرا شد، عین همین مقداری را که به state داده بودید در ar.AsyncState متد هدف callback تحویل میدهد.
این قابلیت برای تشخیص این چه دیتایی از کجا رسیده بسیار مهم است، گرچه شاید در کد کلاینت چندان فایده ای نداشته باشد.
ولی کد سرور را مد نظر بگیرید، متد callback که رسیدن اطلاعات را تشخیص میدهد، چگونه بفهد که این اطلاعات از کدام کلاینت آمده؟! و به خاطر کدام دستور BeginReceive که برای کلاینتی اجرا شده، حالا جوابی رسیده؟!
در این حال شما میتوانید در state، سوکت، ایندکس کلاینت، ip کلاینت و یا شی ای که اطلاعات کلاینت را در آن نگاه میدارید (در کد نمونه کلاسس دست ساز ClientItem) به BeginReceive پاس دهید تا بعد که متد مورد هدف callback اجرا شد، بتوانید تشخیص دهید به خاطر رسیدن دیتا از کدام کلاینت اجرا شده.
===
متد callback باید پارامتر ar As System.IAsyncResult را که دریافت کرده به متد EndReceive سوکت اولیه بدهید تا چرخه BeginReceive و EndReceive تکمیل شود.
متد EndReceive یک Integer پس میدهد که نمایانگر تعداد بایتهای دریافت شده است.
یعنی اطلاعات جدید دریافت شده از نقطه offest مشخص شده در BeginReceive شروع و به تعداد همین عدد Integer ادامه مییابد.
باید توجه داشت که یک بار صدا زدن BeginReceive، فقط یک دریافت اطلاعات را قفل میکند و برای دریافت مدام داده ها باید چرخه BeginReceive و EndReceive را مدام تکرار کرد.
==============================
System.Net.Sockets.TcpListener
شاید مهم ترین متد در این کلاسس BeginAcceptSocket باشد، این متد از نظر اصولی خیلی شبیه BeginReceive کلاس Socket است.
این متد به جای خبر دادن رسیدن دیتا، شما را از اتصال یک کلاینت جدید آگاه میکند.
یعنی در سرور با اجرای این متد، سوکت کلاینتی که بخواهد وصل شود، تشخیص داده شده و با اتصالش موافقت میشود.
متد مذکور فقط دو پارامتر میگیرد
که کار این دو پارامتر دقیق مثل پارامترهای مشابه در متد Socket.BeginReceive است، که پیش از این شرح داده شد، فقط handler پارامتر callback باید به متدی اشاره کند کهاتصال کلاینت های جدید را مدیریت میکند.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در این متد callback باید متد EndAcceptSocket با پارامتر ar As System.IAsyncResult ورودی صدا زده شود تا چرخه BeginAcceptSocket و EndAcceptSocket تکمیل شود.
متد EndAcceptSocket چرخه را تکمیل میکند و یک وهله از کلاسس Socket را باز میگرداند، که این نمونه یک اتصال به Socket نظیر کلاینتش است و هر چیزی که با این نمونه Socket ارسال و دریافت شود، فقط صرفاً به همان تک کلاینت مربوط میشود.
باید پس از تحویل گرفتن این نمونه Socket ، روی آن یک BeginReceive اجرا کنید، تا بتوانید به ارسالات کلاینت گوش فرا دهید.
خیلی خیلی خیلی خیلی ممنون استاد
آقا اگه موافق باشی دیگه این تاپیک رو ادامه ندیم!
آخه اصلاً راضی نیستم که برای من، شما به زحمت بیافتید و انقدر تایپ کنید.
واقعاً شرمنده ام.
توضیحات بسیار مبسوط (اگه درست نوشته باشم) و خوبی بود
امروز آنالیزش رو تموم می کنم.
البته تعریفات ابتدایی رو تقریباً خوب بلدم ولی مشکلم محدودیت های Server Side ه.
الان من اگر بخوام اون چت رو درست کنم باید چه کنم؟
اون برنامه که بهم دادید (حداقل قبل از آپدیت شدنش. آخه این جدیده رو هنوز ندیدم.) با باز کردن یک سرور و دو کلاینت، این اتفاق می افته:
کلاینت 1 که حرف بزنه، بدون فرق برای سرور، می نویسه که "فلان" (یعنی دقیقاً هر چیزی که گرفته شده رو می نویسه)
و بد تر از اون، سرور که یه چیزی رو بفرسته، هم کلاینت 1 و هم کلاینت 2، با هم دریافت می کنند
حالا سوالات اینه:
1- با Thread و اینجور چیز ها نمیشه سرور رو همیشه اجذا نگه داشت که فشار خیلی زیاد به سرور نیاد و با این پروژه ی من کار بکنه؟
2- چجوری بفهمه که کی، چی گفته (البته تو آموزش آخر تون، این رو گفتید. باید دقیق تر بخونمش)
سلام
من مشکلی ندارم، و تا اتمام مشکلات شما در حد وقتم در خدمت هستم، ولی اگر شما مشکل دارید و نمیتوانید روی قضیه وقت بگذارید یا نمیخواهید مثل من.... تاپیک خودتان است، مختارید!
اصل تفاوت در asp.net به دو چیز مربوط میشود
1- به محل نگه داری اشیا مربوط میشود که دیگر نمیتوان در داخل webpage ها باشد، باید تمام متغیرها اصلی یا به طور کلی نمونه کلاسس CClientChat و CServerChat را به مکان امنی مثل Appilication منتقل کنید.
2- اگر میخواهید پیغام های جدید دریافتی در صفحات aspx منعکس شود، حتماً میدانید که در هیچ پلتفرم تحت وبی نمیتوان با دستور سمت سرور، کلاینت را Refresh کرد، ولی میتوان با کد js (که اگر تلفیق با ajax شود، فوق العاده عالی میشود) به صورت تایمیک، صفحه به سایت مراجعه کند و در صورت وجود داده جدید، خود را آپدیت کند.
اولاً که منظورتان را نمیفهمم، یعنی اون میگه، بادمجان، این باید بنویسه، سیب زمینی؟!
دوماً این فقط یک کد نمونه است، مثل این میماند که من یک کد MsgBox بنویسم که عبارت Hello را نشان دهد و شما بگویید، این خوب نیست، چون من میخواهم عبارت How Are You را نشان دهد!!!!!!!!!
کد دست شما است، شما برنامه نویس هستید، هرکاری میخواهید بکنید، مشکلی وجود ندارد، فراموش نکنید، باور کنید که شمائید که باید به رایانه خنگ بگویید چه کار کند، نه ان!
باز هم همان جوابتان میشود، شما برنامه نویس هستید! در اصل من خودم اینکار را با یک حلقه for انجام دادم (فایل CServerChat جدید، خط 62) یک حلقه ساده for که عمل send را برای تک تک کلاینت ها انجام میدهد، نمیخواهید؟ برش دارید! کار سختی نیست.
در واقع در کار سوکتی شما به یک خط ارتباط دو سویه بین کلاینت و سرور میرسید که تمام نقل و انتقالات دست شما است.
- حال مثلاً شما نیاز دارید تا سرور پیغامی را به تمام کلاینت ها بفرستد (مثل کاری که من کردم) می آیید و یک حلقه for میگذارید تا عمل ارسال برای همه انجام شود.
- یا نیاز پیدا میکنید، یک کلاینت بتواند برا یک کلاینت دیگر اطلاعات بفرستد و بگیرد، برای این کار هم سرور را میانجی میکنید، کلاینت اطلاعات را به سرور میفرستد و در بخش مشخصی از دیتا ها مشخص میکند که این بسته باید برای فلان یکی کلاینت ارسال شود، و کد سرور بسته را به کلاینت دیگر میفرستد، یعنی از این دست میگیرید و از آن دست به دیگری تحویل میدهد
مجدداً تاکید میکنم، شما یک ارتباط امن و کاملاً مشخص بین سرور و هر تک کلاینت دارید، که وقتی پیغامی فرستاده یا دریافت میشود به وضوح مشخص است از کدام کلاینت است و به راحتی میتوانید برای سادگی بیشتر به هر کلاینت یک ID عددی یا رشته ای هم نصبت دهید.
مثل یک تلفن فرض کنید، که بین هر نمونه کلاینت و سرور یک خط تلفن فعال وصل و آماده است و میتواند هر دیتای بایتی را رد و بدل کند، یک خط تلفن مشخص و ایزوله بین هر کلاینت با سرور. OK ؟؟؟؟
در کد نمونه من برای هر کلاینت یک وهله از کلاسس دست ساز ClientItem را میسازم تا اطلاعات آن کلاینت را نگاه دارد، که در کد من فقط دو پارامتر اصلی یعنی Socket و Buffer نگاه داشته میشود، ولی شما میتوانید هر آیتمی به این کلاسس اضافه کنید مثلاً UserName یا FirstName یا LastDateTimeDialog یا هر چیز دیگری که بخواهید...
طبیعی است که این موارد اضافه را هم باید در اولین بار وصل شدن یک کلاینت پر کنید (فایل CServerChat جدید، خط 74) یا با هر روش دیگر، مثلاً میتوانید برای کدهای خودتان اینطور قرارداد کنید که پس از اتصال، اولین داده ارسالی یک String باشد که شامل UserName کلاینت باشد، و کلاینت به محض اتصال خودش این را ارسال کند....
اینها را که انجام دادید، دیگر فکر کنم قبول داشته باشید که داشتن مقدار ClientItem (و طبیعتاً متغیرهای داخلش) برای شناسایی کلاینت در هر زمان کافیست.
خوب هر زمان که داده جدیدی دریافت شود، کد نمونه جاری وهله ClientItem اش را به دست می آورد (فایل CServerChat جدید خط 102) به راحتی تمام اعضای ClientItem به محض رسیدن داده جدید در اختیار شما قرار میگیرد و شما میتوانید رویش عملیات مورد نظر خود را انجام دهید.
به لطف دات نت زیاد هم نمیخواهد نگگران ایجاد ریسمان و مدیریت ان باشید.! وقتی از متدهای سری BeginXXXXXX و EndXXXXXX استفاده میکنید، در اصل (معمولاً) خود دات نت یک ریسمان دیگر ساخته و مسئول انجام عمل فوق الذکر میکند و این یعنی پردن کارها به ریسمان های دیگر.
فقط اگر قرار است کار زمان بری را با خود ریسمان درخواست کننده صفحه aspx انجام دهید، باید توجه داشته باشید که این ریسمان (بسته به تنظیمات web.config) یک timeout مشخصی دارند، که اگر ظرف این مدت کارشان تمام نشود و خروجی را برای دانلود و ارسال به مرورگر تحویل ندهند، ریسمان متوقف خواهد شد.
مثلاً من در کدم ارسال به تمام کلاینت ها از متد Send استفاده کردم، این متد کار را در ریسمان مجزا انجام نمیدهد و در اصل به مدت ارسال داده ها ریسمان میخوابد، کهع اگر این خواب را در تعداد کلاینت ها ضرب میکنیم، میبینیم که انجام عمل Send برای تمام اعضا، با همان ریسمان درخواست کنند صفحه aspx کار خوبی نیست و میتواند منجر به timeout و توقف ریسمان شود، مثلاً برای حل این مشکل میتوانید خودتان یک ریسمان جدید بسازید تا آن حلقه For شامل Send را اجرا کند یا اینکه به جای Send از جفت BeginSend و EndSend استفاده کنید، که برای هر ارسال کلاینت در حالت ایده آل از یک ریسمان مجزا استفاده میکند.
==========
فکر میکند من چند سال یا ماه یا .. طول کشید تا کد نویسی سوکتها را در دات نت یادبگیریم؟؟؟؟
فقط حدود 2 ساعت!
یعنی دو ساعت قبلبش هیچ نمیدانستم، و دو ساعت بعد، بدون هیچ فرد یا pdf یا کتاب و حتی بدون مراجعه به MSDN ، و فقط با امتحان کد و Object Browse توانستم کار تحت سوکتها را در دات نت یادبگیریم و حتی یک برنامه فیلم برداری از صفحه نمایش هم بنویسم، دلیلش هم فقط و فقط باور داشتن به سادگی مسئله و یک وقت گذاشتن سیر و بدون هواس پرتی دوساعته بود، بدون شک شما هم متوانید یار هر کسی که بخواهد و وقت بگذارد.
البته من به هیچ وجه نخواندن دروس کنکور را پیش نهاد نمیکنم، فردا نیایید بگید، این منو اغفال کرد!!!!من چه کاره بیدم!
==========
در آخر برای شما و بیشتر دوستان دیگر یاداوری میکنم که در حالت واقعی برای پیاده سازی یک چت انلاین و بدون exe در داخل یک سایت مشخص، هیچ نیاز به استفاده از Socket نیست.
یعنی در موردی که همه افراد چت کننده، بدون هیچ برنامه exe کمکی، وارد تک سایت مشخصی میشوند و چت میکنند. در این حالت استفاده از سوکت یعنی چرخواندن لقمه!
ولی خوب اگر جنبه آموزشی و یادگیری یا کارکردی متفاوت با چت داشته باشد، بحث فرق میکند...
موفق باشید.
Last edited by _H2_; 28-06-2008 at 02:17.
من که مشکلی ندارم. تازه از خدام هم باشه که یه استاد توپ گیرم اومده.من مشکلی ندارم، و تا اتمام مشکلات شما در حد وقتم در خدمت هستم، ولی اگر شما مشکل دارید و نمیتوانید روی قضیه وقت بگذارید یا نمیخواهید مثل من.... تاپیک خودتان است، مختارید!
فکر نمی کنم نیازی باشه. خب امنیت Web هم انقدر هست که بتونه کل کار رو ردیف کنه.به محل نگه داری اشیا مربوط میشود که دیگر نمیتوان در داخل webpage ها باشد، باید تمام متغیرها اصلی یا به طور کلی نمونه کلاسس CClientChat و CServerChat را به مکان امنی مثل Appilication منتقل کنید.
می دونم. برای همین هم گفتم که از دیتابیس استفاده کنم.اگر میخواهید پیغام های جدید دریافتی در صفحات aspx منعکس شود، حتماً میدانید که در هیچ پلتفرم تحت وبی نمیتوان با دستور سمت سرور، کلاینت را Refresh کرد، ولی میتوان با کد js (که اگر تلفیق با ajax شود، فوق العاده عالی میشود) به صورت تایمیک، صفحه به سایت مراجعه کند و در صورت وجود داده جدید، خود را آپدیت کند.
منظورم رو بد رسوندم.اولاً که منظورتان را نمیفهمم، یعنی اون میگه، بادمجان، این باید بنویسه، سیب زمینی؟!
دوماً این فقط یک کد نمونه است، مثل این میماند که من یک کد MsgBox بنویسم که عبارت Hello را نشان دهد و شما بگویید، این خوب نیست، چون من میخواهم عبارت How Are You را نشان دهد!!!!!!!!!
منظورم این بود که بتونه تشخیص بده که چه کسی این حرف رو زده و اسمش رو به buffer اضافه کنه و نشون بده.
که تو آخرین توضیحاتتون، کاملاً روشن کردید.
آخ. ببخشید.باز هم همان جوابتان میشود، شما برنامه نویس هستید! در اصل من خودم اینکار را با یک حلقه for انجام دادم (فایل CServerChat جدید، خط 62) یک حلقه ساده for که عمل send را برای تک تک کلاینت ها انجام میدهد، نمیخواهید؟...
اصلاً نمی تونم کد رو آنالیز کنم. آخه تا میام برم سرش، 1000 تا کار برام پیش میاد.
ولی قول می دم که امروز تمومش مکن. (این خط، این هم نشون. تا سال دیگه هم تموم نمیشه)
از اونجایی که من زیاد با NET. و امثال هم کار نکردم و تازه دارم ASP.net 3.5 unleashed رو می خونم، ( تازه صفحه 120 ام :اسمایل ناراحت: ) میشه یه تیکه نمونه کد بدید که چجوری بهش ID بدم که بعداً بتونم با اون ID بهش چیزی بفرستم؟مجدداً تاکید میکنم، شما یک ارتباط امن و کاملاً مشخص بین سرور و هر تک کلاینت دارید، که وقتی پیغامی فرستاده یا دریافت میشود به وضوح مشخص است از کدام کلاینت است و به راحتی میتوانید برای سادگی بیشتر به هر کلاینت یک ID عددی یا رشته ای هم نصبت دهید.
آره. باید این کار رو بکنم.جای Send از جفت BeginSend و EndSend استفاده کنی
(ولی مشکل اینجاست که بلد نیست. ولی الان که کد رو آنالیز کنم، یاد میگیرم)
خب همه که مغزشون مثل شما نیست. خدا جلبک رو هم آفریده. جلبک هم دل داره، می خواد چت بنویسهفکر میکند من چند سال یا ماه یا .. طول کشید تا کد نویسی سوکتها ...
نمیشه مثل کانکشن، Packet الکی (خالی) بفرستی که time out نشه؟ یا نمیشه تو web.config اون رو بی نهایت کرد؟فقط اگر قرار است کار زمان بری را با خود ریسمان درخواست کننده صفحه aspx انجام دهید، باید توجه داشته باشید که این ریسمان (بسته به تنظیمات web.config) یک timeout مشخصی دارند، که اگر ظرف این مدت کارشان تمام نشود و خروجی را برای دانلود و ارسال به مرورگر تحویل ندهند، ریسمان متوقف خواهد شد.
واما حرف ها من:در آخر برای شما و بیشتر دوستان دیگر یاداوری میکنم که در حالت واقعی برای پیاده سازی یک چت انلاین و بدون exe در داخل یک سایت مشخص، هیچ نیاز به استفاده از Socket نیست.
اینی که می خوام بنویسم چت بین اعضای سایت خودم نیست.
می خواستم نگم و آخرش که تموم شد، همه رو سولپلایز کنم.
بذار با شکل بگم که تو PHP چی کار کردم. احتمالاً همون کار رو باید تو NET. بکنم با این تفاوت که BeginReceive و اینها رو باید توش بذارم:
یوزر میاد تو صفحه ی index.php (قراره که همه کار تو یه صفحه انجام بشه. البته فقط User Interface ش)
بعد یه ارتباط با آجاکس درست برقرار میشه بین اون صفحه ای که یوزر توشه و یه صفحه که می تونه اطلاعات رو تو DataBase بریزه و ازش بخونه. (که باید با اون صفحه ی سوکت هامون یکی نباشه)
و Username و Password رو به سرور میفرسته ولی فقط با یک متغیر. همونجوری که در عکس هست.
اون صفحه ی DB هم هیچ کاری رو داده ها انجام نمیده و مستقیماً می فرسته شون تو یه جدول به نام Requests
واسه یوزر یه پیغام میاد که "صبر کنید..."
و یه settimeout می ذاریم که هر 5 ثانیه 1 بار، وصل بشه به صفحه DB و ازش بپرسه که آیا من وارد شدم؟
اگر وارد شده بود، محتوای صفحه عوض میشه با صفحه چت. وگرنه ارور میده و تموم.
این وسط همه ی کارها می افته گردن اون صفحه ی سوکت هامون که من سمش رو ASP.net می گم (برای آسونی مطلب)
سرور باید بتونه هر 5 ثانیه، (اگه 5 ثانیه کمه، میشه بکنیم 30 ثانیه. برای فشار سرور) Database رو بخونه و ببینه که آیا درخواست جدیدی اومده، یا نه.
برای این کار من به جدولم یه ID دادم که Auto Increment باشه و بگم که
که هر ID رو که انجام میده، LastDoneID رو مساوی اون قرار بده برای دفعات بعدکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد سرور با "," میاد اون درخواست رو پردازش می کنه و می فهمه که یوزر می خواد لاگین کنه.
User & Pass رو دستش می گیره ( اصل نکته اینجاست: )
یه ارتباط ناهمزمان (یا به قول فرنگی ها Async با همون BeginSend) با یه سرور دیگه برقرار می کنه.
به این شکل:
حالا ممکنه از DB چیزی غیر از لاگین بخونه. مثلاً sendmessage,user1,user2,hi
باید اینجا یه فرقی باشه بین درخواست لاگین و فرستادن پیغام.
اگر درخواست لاگین بود، باید با یوزر طرف به عنوان ID بره یه دونه tcpClient درست کنه و اگر ارسال پیغام بود، بره سوکتی که با نام user1 درست شده رو پیدا کنه و باهاش مثلاً بفرسته که:
و وقتی که جواب نا همزمان از سرور ثالث اومد، اون رو یه پردازش بکنه و بذاره تو Database مثلاً تو جدول Responseکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا یوزری که لاگین کرده، هر 5 ثانیه از یه صفحه مثلاً DB2 می پرسته که چیزی نیومده؟
اون هم میره جدول Response که اون هم ID به صورت Auto Increment داره رو می خونه و جواب های جدید رو ور می داره و پردازش می کنه و به یوزر تحولی میده.
خب این طرح من بود که غیر از ناهمزمانی هاش، بقیه اش رو تو PHP پیاده کردم و با 1 یوزر کاملاً عالی جواب میده.
امیدوارم که خوب توضیح داده باشم.
دیگه ریش و قیچی دست خودت. ببینم چجوری با NET. می تونیم این رو درست کنیم.
مرسی یه تا اینجاش رو خوندی و یه خط در میون هم نخوندی.
باز هم ممنون
سلام
میبخشید، من منظورم را بد بیان کردم، منظورم اون امنیت نبود، یعنی توجه به خطرات امنیتی هم خوب است ولی منظور من آن نبود، منظور من امنیت خاطر باید از بین نرفتن اطلاعات بود، مثلاً میدانید که داده های داخل webpage ها بعد از اتمام رندر html از بین میرود، یا اطلاعات Session و Cookie و Cache و... که میدانید، هیچ حساب و کتاب و اطمینانی به حفظشان در رجوع بعدی نیست....به مکان امنی ...
ولی Application یا Database این امنیت خاطر را دارد که دفعه بعد که مراجعه کنید، داده سر جایش است.
باید اعتراف کنم (تا گناهم سبک شود!) که فهمیدم منظورتان چی بود ولی میخواستم کمی بحث را .....اولاً که منظورتان را نمیفهمم، یعنی اون میگه، بادمجان، این باید بنویسه، سیب زمینی؟!
معلوم بود که شما نگران ان username کوچک در کنار درج پیغامها هستید.
جواب سوالات بیشتر در قسمت "دوماً" بود.!
این همه تایپ کردم، در سه عبارت، سه بار تاکید کردم ... آن وقت شما باز ....... همه که مغزشون ....
به نظز من استعداد همان علاقه است.
این کار اصلاً درست نیست، و میتواند یک نقطه ضعف در کارائی و امنیت باشد.نمیشه تو web.config اون رو بی نهایت کرد؟
به راحتی میتوانید یک ریسمان مجزا را به کار مورد نظر اختصاص دهید، خیلی ساده است. New و Start !!!
اون نکته بیشتر برای دیگران گفتم، همانطور که در متنش هم اشاره کردم، که شاید کس دیگری این مطالب را بخواند و تصورات اشتباهی کند....بین اعضای سایت خودم نیست...
انشا ا......میشه یه تیکه نمونه کد بدید که چجوری بهش ID بدم ....
حقیقتش دیرتر به پستتان جواب دادم، امیدوارم بودم که امروز بتوانم چیزی حاضر کنم، که متأسفانه وقت نشد... شرمنده، سعی میکنم نمونه جدیدی تکمیل کنم.
موفق باشید.
آقا این دفعه چقدر جوابت کوتاه بود
ممنون که وقت می ذاری
منتظر نمونه هستم
سلام
میبخشید طول کشید، هر کاری کردم، وقتم خالی پیدا نکردم....
نمونه جدید، کامل نیست
ولی دیدم اگر بخواهم صبر کنم تا کاملش کنم، شاید خیلی....
البته چندان هم ناقص نیست، بهتر است ببینید.
کلاینتها بدون هیچ مشکلی میتوانند با هم ارتباط داشته باشند.
موفق باشید.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)