ممنون
الان دانلودش می کنم
ممنون
الان دانلودش می کنم
متأسفانه در حال حاضر فایل مورد درخواست شما برای دانلود موجود نیست !
این مسئله ممکن است موقتی یا دائمی باشد و یا به علت عدم استقبال و دانلود از آخرین تاریخ دانلود باشد.
![]()
سلام
شما میتوانید آخرین نسخه را همراه با PDF فارسی از لینک زیر دانلود کنید:
h02.ir/Download.aspx?File=SampleSocketChat.zip
تاپیک:
forum.p30world.com/showthread.php?t=276352
سلام دوستان
من تازه در اين سايت ثبت نام كردم و از اين تاپيك خيلي خوشم اومد چون يكي از مشكلات اصلي من بود و هست.
من چند تا سوال دارم:
اول اينكه من يه برنامه تحت وب نياز دارم كه يه سري دستورات به يك application بر روي يك سرور داده و جواب اون رو روي سايت نمايش بده. مثلا وب ميگه سلام و جواب مياد عليك سلام كه اين جواب بايد روي سايت نمايش داده بشه.
برنامه اي كه من نوشتم اولين پيغام رو درست ميفرسته و جواب هم برميگرده ولي اولا نميتونم جواب رو روي صفحه نمايش بدم كه واسه اين كار مجبور شدم پيغام رو روي يك فايل ذخيره كنم و بعد تو تايمر صفحه رفرش بشه كه اصلا از اين كار خوشم نمياد.
ثانيا مشكل در پيغام فرستادن بعدي هست. وقتي پيغام اول ميره و صفحه رفرش ميشه، تمامي پيغامها ريسيو ميشن ولي واسه فرستادن پيغام جديد ميگه كانكشن بسته است و وقتي كانكشن رو دوباره باز ميكنم يك كانكشن جديد ايجاد ميشه و همه چي بهم ميريزه.
ميشه اولا خواهش كنم يه مثال برام بفرستيد و ثانيا بهم بگيد مشكل من كجاست؟
واقعا ممنون ميشم
باز هم سلام
گفتم بهتره كد برنامه ام رو براتون بفرستم اونجوري بهتر ميشه نظر داد
Imports System
Imports System.Text
Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Partial Class WebForm1
Inherits System.Web.UI.Page
Dim Client As New TcpClient
Dim BufferSize(Client.ReceiveBufferSize - 1) As Byte
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Client.Connect("127.0.0.1", 80)
SendMessage("Hello")
Client.GetStream().BeginRead(BufferSize, 0, BufferSize.Length, AddressOf ReceiveMessage, Nothing)
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
SendMessage("Hello2")
End Sub
Public Sub SendMessage(ByVal message As String)
Try
Dim netStr As NetworkStream = Client.GetStream()
Dim Data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)
netStr.Write(Data, 0, Data.Length)
netStr.Flush()
Catch ex As Exception
Console.WriteLine(ex.ToString())
End Try
End Sub
Public Sub ReceiveMessage(ByVal ar As IAsyncResult)
Dim bufferLength As Integer
Dim message As String
Try
SyncLock Client.GetStream
bufferLength = Client.GetStream().EndRead(ar)
End SyncLock
If bufferLength < 1 Then
Client.Close()
End If
message = System.Text.Encoding.ASCII.GetString(BufferSize, 0, bufferLength).ToString()
Console.WriteLine(Client.Client.RemoteEndPoint.ToS tring() + "-> " + message)
Client.GetStream().BeginRead(BufferSize, 0, BufferSize.Length, AddressOf ReceiveMessage, Nothing)
Catch ex As Exception
Console.WriteLine(ex)
Client.Close()
End Try
End Sub
End Classتو كد بالا پيغام اول كه زمان لود صفحه هست درست منتقل ميشه و برنامه شروع به گرفتن جوابها ميكنه.
تا اينجا درسته ولي اولا پيغام دوم (Hello2) وقتي ميخواد Send بشه ميگه كانكشن بسته است. درحالي كه كانكشن بر روي برنامه سرور بازه. وقتي دوباره كانكت ميزنم تعداد كانكشنها بر روي برنامه سرور ميشه ٢ تا و الي آخر.
مشكل دوم اينه كه پيغامي كه تو receive message مياد كه تو متغير message نگهداري ميشه رو نميتونم روي صفحه وب نمايش بدم. از delegate هم استفاده كردم ولي نشد.
ممنون ميشم راهنماييم كنيد.
سلام
توضیحاتتان ناقص است و محیط و نحوه استفاده شما را مشخص نمیکند.اول اينكه من يه برنامه تحت وب نياز دارم كه يه سري دستورات به يك application بر روي يك سرور داده و جواب اون رو روي سايت نمايش بده. مثلا وب ميگه سلام و جواب مياد عليك سلام كه اين جواب بايد روي سايت نمايش داده بشه.
آیا چیزی مشابه چت در یک سایت میخواهید راه اندازی کنید؟
برنامه winapp که ندارید بخواهد به سایتی وصل شود (چون انوقت نمایش در سایت بی معنی میشود!) ؟
اگر چیزی مشابه چت در خود یک سایت میخواهید اصلاً نیازی به برنامه نویسی سوکت ندارید!
شما با کمک Ajax و برنماه نویسی عادی ASP.Net می توانید این کار را انجام دهید.
یک سایت که برای ارتباط با خودش نیازی به سوکت ندارد.
بهرحال من هنوز متوجه نشدم طرح دقیق شما چیست و با کاربر چطور رابطه برقرار میکند.
=====
لازم به ذکر است که بد هم نبود یک تاپیک مجزا و جدید در سطح انجمن میزدید ...
شب خوش.
سلام H2 جان
از جوابتان ممنونم، واقعيتش طرح اصلي من گرفتن قيمت ارزها از بانكهاي خارجي هست. مثل همون چيزي كه در فاركس وجود داره.
براي اين كار كدي از نوع string وجود داره كه وقتي اون رو به آي پي و پورت مورد نظر كه بانك تعريف كرده ميفرستي در جواب قيمت ارز براتون فرستاده ميشه. همينطور دستورات ديگري در رابطه با ميزان معامله و ... هم وجود داره كه با فرستادن اونها جوابها بر ميگرده.
اين كار رو با Application به راحتي انجام ميدم و مشكلي نداره يعني هرچيزي كه ميفرستم جواب به درستي برميگرده ولي هدف من اينه كه اين اطلاعات رو بر روي صفحه وب سايت نمايش بدم.
برنامه اي هم كه با asp.net نوشتم تا حدودي اين كار رو ميكنه ولي چندتا مشكل داره.
اول اينكه وقتي يك tcpclient ايجاد ميكنم و كانكشن رو برقرار ميكنم اولين string من به راحتي فرستاده ميشه و بعد از اون برنامه به حالت BeginRead سوكت ميره. خب تا اينجا همه چي درسته و جواب هم به درستي از طرف بانك برميگرده و خونده ميشه. ولي اين جواب رو نميتونم رو صفحه وب نمايش بدم. ميدونم كه بايد از Delegate استفاده كنم ولي نميتونم جواب بگيرم. نميخوام جواب رو هم به صورت فايل يا چيز ديگه اي save كنم چون بعضي از جوابها محرمانه و فقط مخصوص اون كلاينت خاص هستش.
مشكل دوم اينكه براي فرستادن String بعدي پيغام ميده كه كانكشن بسته است. در حالي كه كانكشن بازه و پيغامهاي بعدي كه از طرف بانك ميان خونده ميشن يعني انگار كانكشن من فقط در حالت خوندن پيغامها قرار ميگيره و من ديگه هيچ دسترسي يه اون كانكشن ندارم و مشكل اينه كه حتي نميتونم ببندمش و دائما سرور من در حالت خوندن پيغامها قرار ميگيره. وقتي هم كه مجدد اين كار رو ميكنم تعداد كانكشن بر روي بانك ميشه دوتا. يعني كانكشن قبلي من همون طور باز مونده و داره جوابها رو ميگيره.
نميدونم تونستم منظورمو برسونم يا نه.
در ضمن من بخاطر جوابهاي بسيار زيبايي كه به دوست قبليمون در اين تاپيك داديد خواستم كه بحث قبلي كامل بشه و اگر صلاح بدونين تاپيك جديد ايجاد كنم.
با تشكر فراوان - فقط نارمك![]()
سلام
خوب پس استفاده شما از سوکت منطقی بوده.
اگر مایل بودید مثال و pdf ای در خصوص برقراری ارتباطات سوکتی میتوانید در تاپیک زیر پیدا کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
=====
راحت ترین راه برای این مشکل برقراری ارتباط سوکت با همان ریسمان صفحه aspx و تحت همان صفحه است.ولي اين جواب رو نميتونم رو صفحه وب نمايش بدم
راه حل این یکی دقیقاً برعکس قبلی است!براي فرستادن String بعدي پيغام ميده كه كانكشن بسته است
یعنی سوکت شما نباید تحت ریسمان و دامین کاری همان aspx اجرا و باز شود.
=====
خوب دو تا مشکل دارید که جواب هر یک مخالف دیگری است ولی مشکلی وجود ندارد یک راه حل شرطی و یک راه حل قطعی دارد.
الف) راه حل شرطی اول:
من با هدر های ارتباطی سهام شما آشنا نیستم و برای همین گفتم شرطی ...
اگر لزوم Connect بودن سوکت برای ارتباطات بعدی (همان سوال و جواب خودتان) مهم نیست...
- Timeout زمان کاری ریسمان درخواست های httphandler را افزایش دهید.
- سوکت را با دستورات Using در همان ریسمان و محیط کاری فایل aspx باز کنید و داده را با Send فرستاده و جواب را با Read بگیرید را سوکت را کلاً ببندید و تمام. (توجه کنید نگفتم BeginSend و BeginRead)
پس اگر ارتباطات شما از نظر سرور وابسته به تبادلات قبلی نیست، هر بار سوکت را باز کنید و سوالتان را بپرسید و ببندید.
ب) راه حل نهایی:
ولی در برخی ارتباطات Connect بودن سوکت در کل ارتباطت مهم است و اطلاعات مبادله شده قبلی روی مبادلات جدید تاثیر خواهد داشت.
راه حل قطعی و خوب و کامل این قضیه آنجا است که ...
- شما یک ماژول جامع ارتباطلات غیر همزمان مخصوص کار ناهمران با ASP.Net و Ajax طراحی کنید.
- کلاس ماژول شما باید قابلیت مدیریت همزمان چندین مکالمه جداگانه Server-Client را داشته باشد.
- و با کمک دستورات lock و synclock مناسب قابلیت کامل استفاده و دسترسی همزمان از چندین ریسمان مختلف را داشته باشد.
و ...
یعنی چیزی شبیه این الگو ...
1) شما در این ماژول جامع متدی برای ارسال اطلاعات به صورت نا همزمان خواهید داشت که اطلاعات ارسالی را میگیرد و فقط یک عدد int یا long و... به عنوان کد پیگیری مانند پس میدهد...
(مشابه مکانیزم خود ویندوز در API های دسترسی به فایل ها و رجیستری و... که پس از باز کردن مدخل یک کد اشاره گر 32 یا 64 بیتی برای اعمال بعدی پس میدهد)
2) ریسمان صفحه aspx منتظر ارسال کامل اطلاعات و دریافت پاسخ و... نخواهند ماند و کد اشاره گر یا پیگیری یا هر اسم دیگر را گرفته و به کدهای javascript برای ارتباط Ajax تحویل میدهد.
3) کدهای javascript برنماه در کلاینت در یک پریود زمانی مدام به سرور و یک httphandler مشخص که برای این منظور در نظر گرفته شده وصل میشود و سعی میکند کد اشاره گر یا پیگیری و... را که دارد بدهد و جواب را اگر آماده است بگیرید و نمایش دهد.
(میتوان از کنترلر Ajax-Timer خود asp.net هم استفاده کرد.)
4) برای مکالمات مرتبط بعدی و بستن نهایی ارتباط و... هم از همان هندلر یا اشاره گر یا کدپیگیر اولیه استفاده خواهد شد و با دادن این کد ماژول مرکزی در Collection ای دارد به نمونه سوکت و بافر و... همان ارتباط دسترسی پیدا خواهد کرد و...
5) اگر کدهای ان عدد اشاره گر یا پیگیری پشت سر هم هستند میتوان برای امنیت بیشتر و جلوگیری از شنود ارتباطات توسط یک فرد خاص یک عدد password شانسی را هم برای هر ارتباطات در کنار کد مورد بحث قرار داد.
و...
توضیحات شاید به نظر زیاد بیاید ولی اگر درک کنید و اطلاعات مناسب از برنامه نویسی دات نت داشته باشید، کار چندان مشکلی نیست و حتی شاید با یک روز وقت (6 یا 7 ساعت) هم بتوان نمونه هسته و مازول اصلی مناسب و خوبی نوشت.
=====
شب بخیر.
سلام بر این تاپیک قدیمی!
(الان که دارم می خونم، می بینم چقدر اون زمان ها دات نت بلد نبودم!)
البته الان دارید جواب این دوستمون رو می دید ولی با اجازه من هم بپرسم که حرف های قبلی مون تکمیل بشه.
تمام چیزی که من اون زمان می خواستم، همین "راه حل نهایی" شما بود.
اما خب مشکل پیاده سازی اش ه!
شما وقتی 1 درخواست با Ajax به یه فایل ASP.net می دید و اون بهتون یه ID میده، کار تموم میشه.
حالا اگر جواب درخواست رو بخواید، باید 1 درخواست دیگه با Ajax به اون صفحه بفرستید و ID رو بهش بدید تا مثلاً بگه که نتیجه مطلوب رو بدست آورده یا نه.
اما نکته اینجاست که این درخواست دوم دیگه به اون فایل قبلی فرستاده نشده و یه نمونه ی جدید از اون فایل اجرا شده!
سوکتی هم که قرار بوده با سرور ثالث Connect بمونه و تبادلات رو انجام بده، تو ریسمانی ه که با اولین فراخوانی فایل، ساخته شده!
و دیگه نمیشه بهش دسترسی داشت!
میشه این روش رو پیاده کنید؟
ممنون
سلام
واقعا از توضيحاتتون ممنونم. كلي مارو شرمنده كرديد.
تقريبا ٦٠% توضيحاتي كه داديد رو فهميدم و بعضي چيزها رو نفهميدم. آخه من هم مثل دوست قديميمون در دات نت مخصوصا تحت وب خيلي كم تجربه ام. من در اصل برنامه نويس Application تو دلفي هستم ولي الان به شدت نياز به اين صفحه تحت وب دارم.
من صفحه وب خودم رو ماي وب اسم ميذارم و سروري كه اطلاعات رو به من ميده سرور بانك اسمشو ميذارم.
موضوع اينجاست كه من ميبايست يك كد براي شناسايي از ماي وب به سرور بانك از طريق سوكت بفرستم مثلا ميگم "قيمتها" و بعد از اون سرور بانك شروع به فرستادن قيمتها ميكنه. اين روند تا زمان بسته شدن صفحه ماي وب من ميبايست ادامه پيدا كنه.
قسمت دوم اينه كه من در حين اينكه سرور بانك قيمتها رو براي من ميفرسته نياز به اين دارم كه دستورات ديگه اي از ماي وب بفرستم مثلا بگم "قيمتها بر اساس ريال" و اينجاست كه گير ميكنم.
تو حالت اول يه كانكشن ايجاد ميكنم و دستور اول فرستاده ميشه. بعد هم ماي وب شروع به گرفتن اطلاعات از سرور بانك ميكنه. براي اينكه بتونم اطلاعات رو روي صفحه نمايش بدم از xml و تايمر استفاده كردم كه بد نبود و جواب داد.
ولي حالا كه ميخوام پيغام دوم رو بفرستم ديگه كانكشن بازي روي ماي وب وجود نداره، برام عجيبه كه پس چطور پيغامها از طرف سرور بانك مياد؟
حالا يك كانكشن جديد ايجاد ميكنم و پيغام جديد رو ميفرستم ولي سرور بانك اينو بعنوان كانكشن شماره ٢ ميشناسه چون از نظر سرور بانك كانكشن قبلي هنوز بازه. بخاطر همين يه كم مشكل پيدا ميكنم.
و مشكل آخر اينه كه وقتي من ماي وب رو ميبندم هنوز سرور بانك داره قيمتهاشو ميفرسته. نميدونم چرا كانكشنم بسته نميشه؟
كدي كه تو بالا نوشتم اين اشكالات رو داره. درضمن لينك دانلود شما هم خطا ميده و نتونستم دانلود كنم.
ممنون
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)