سلام
من هنوز نتونستم مشكلمو حل كنم
خواهشا فقط يه example تحت وب واسه ارسال و دريافت از طريق سوكت به من بديد و اينكه اين كار فقط با يك كانكشن باشه و بتونم كانكشن رو هر وقت خواستم disconnect كنم.
ممنونم
Printable View
سلام
من هنوز نتونستم مشكلمو حل كنم
خواهشا فقط يه example تحت وب واسه ارسال و دريافت از طريق سوكت به من بديد و اينكه اين كار فقط با يك كانكشن باشه و بتونم كانكشن رو هر وقت خواستم disconnect كنم.
ممنونم
سلام
خیلی واضح است که این اطلاعات و اشیا باید در محلهای static و یا شی Application و یا Cache نگه داری شود.نقل قول:
میشه این روش رو پیاده کنید؟
اصلاً به همین دلیل گفتم که به یک id نیاز داریم تا ajax ان id را بدهد و اطلاعات و آخرینت وضعیت را بگیرید.
اگر قرار بود همه چیز با همان ریسمان های خودشان و در محدوده دید خودشان نگه داری شود که id نمیخواست.
در واقع اطلاعات وضعیت و سایر اطلاعات مورد نیاز در یک ساختار Dictionary مانند در مکانی عمومی نگه داری میشود که کلید ان همان id است و در خواست های Ajax از ریسمان های مختلف می آیند و به این Dictionary ارجاع میدهند و آخرین دیتای موجود را میخوانند.
در دیتا وضعیت در یک struc ذخیره شده باشد خود ریسمانی که مسئول پردازش اولیه این درخواست و مدیریت سوکت هم است باید id را بداند و با هر مرحله تغییر و پیشرفت خانه و سطر Dictionary مورد نظرز را به روز کند.
ولی اگر دیتا در یک class ذخیره شده باشد چون class ها ساختار اشاره گری دارند و در حافظه هیپ هستند ریسمان مسئول پردازش ریسمان فقط وهله همان class دیتا را دارد و فیلدهای ان را با هر تغییر به روز میکند.
یعنی شما میفرمائید در کلاینت connection بسته شده در حالیکه سرور هنوز ان را باز میداند؟نقل قول:
ولي حالا كه ميخوام پيغام دوم رو بفرستم ديگه كانكشن بازي روي ماي وب وجود نداره، برام عجيبه كه پس چطور پيغامها از طرف سرور بانك مياد؟
حالا يك كانكشن جديد ايجاد ميكنم و پيغام جديد رو ميفرستم ولي سرور بانك اينو بعنوان كانكشن شماره ٢ ميشناسه چون از نظر سرور بانك كانكشن قبلي هنوز بازه. بخاطر همين يه كم مشكل پيدا ميكنم.
از مجموعه این جملات و جملات قبلی تان اینطور نتیجه میگیرم که خود کدنویس تان مشکل دارد ولی همینطوری نمیتوانم بگویم کجایش را اشتباه کرده اید.نقل قول:
و مشكل آخر اينه كه وقتي من ماي وب رو ميبندم هنوز سرور بانك داره قيمتهاشو ميفرسته. نميدونم چرا كانكشنم بسته نميشه؟
در کل برای تحت وب و Asp.net این را پیشنهاد میکنم.نقل قول:
حالا يك كانكشن جديد ايجاد ميكنم و پيغام جديد رو ميفرستم
... اينكه اين كار فقط با يك كانكشن باشه و بتونم كانكشن رو هر وقت خواستم disconnect كنم ...
یعنی اینکه هر سوکت را خیلی سریع باز کنید و یک کار را انجالم دهید و در اولین فرصت سوکت را ببندید.
چون ذات برنامه های وبی، فضای مطمئنی برای نگه داری یک شی به طور زنده در حافظه ندارد.
از این هاستینگ درپیت است! در ساعت دیگر و متفاوت سعی کنید دانلود کنید.نقل قول:
درضمن لينك دانلود شما هم خطا ميده و نتونستم دانلود كنم
[quote]
خواهشا فقط يه example تحت وب واسه ارسال و دريافت از طريق سوكت به من بديد
[/.quote]
متاسفانه و با شرمندگی بسیار باور بفرمائید فرصت این یکی را ندارم.
الآن هم اگر ملاحظه کنید متوجه میشوید ساعت از یک و نیم بامداد هم گذشته که وقت کردم انلاین شوم و تازه شرمنده چند نفر از دوستان هم هستم که پیام خصوصی هایشان بی جواب مانده ...
سوال را شاید اگر بلد باشم، فرصت کنم جواب دهم ولی سمپل و پروژه و... :11::11::11::11::11:
=====
احتمالاً قبلاً گفتم ولی خودم یادم رفته چی گفتم ...
بحرحال یاد اوری میکنم که اگرکه سرور و کلاینت وب از خودتان و تحت کنترلر خودتان است از پروتکل های سطح بالاتر استفاده کنید که کنترلر جزئیات بیشتر بر عهده سیستم عامل و فریم ورک و سایر برنامه ها باشد کد شما خیلی کوتاه و مختصر تر شود ...
مثلاً در ساده ترین شکلش میتوانید اجازه دسترسی به بانک SQLServer سرور را به کلاینت هم بدهید.
یا حداقل از یک وب سرویس استفاده کنید و یا از یک httphandler که فایل xml یا rss خروجی بدهد استفاده کنید و...
شب بخیر.
سلام
واقعا شرمنده ام كه تا اين وقت شب مجبور شديد جواب منو بديد.
از توضيحاتتون واقعا ممنونم.
از توضيحاتتون يه چيزايي دستگيرم شد ولي متاسفانه من تو دات نت خيلي ضعيفم.
يه جورايي موفق شدم جواب بگيرم ولي مشكل بسته شدن كانكشن وجود داره.
فرض كنيد من يك tcpclient ايجاد ميكنم بنام test و با اون پيغامم رو ميفرستم. تا اينجا كانكشن بازه و رو سرور هم ميبينم كه بازه و به راحتي هم disconnect ميشه.
حالا برنامه ميرسه به قسمت BeginRead ، خب هنوز كانكشن بازه ولي از بعد از اين دستور حالا ديگه نه ميتونم پيغامي بفرستم نه ميتونم test رو ببندم چون ميگه كانكشن شما بسته است.
رو سرور كه نگاه ميكنم ميبينم كانكشن بازه و اگر از طرف سرور پيغامي بفرستم كلاينت دريافت ميكنه.
نميدونم چه اتفاقي ميفته؟
واقعا شرمنده از اينكه اينقدر وقتتون رو ميگيرم
با تشكر.
سلام
مشکل فعلی شما به دلیل تز حوزه خارج شدن و پاک شدن کلاس page جاری است.
کلاس page مکان مناسبی برای نگه داری طولانی مدت متغییرها نیست.
قبلا هم کلیاتش را خدمتتان عرض کردم...
شما نیاز به یک کلاس مجزا جهن مدیریت کل این ارنباطات دارید.
از سایر page ها فقط بای متدهای این کلاس اجرا شود.
اشاره گر این کلاس باید جهت عمومی بودن و از حوزه خارج نشدن و عدم جمع اوری توسط garbage، باید به صورت vb.shared یا cs.static و همچنین در شی Application تعریف شود.
خیلی سعی کردم وقتی بگذارم و کد کاملتری برایتان بگذارم، ولی واقعاً و با شرمندگی کاملتر از این فرصت ندارم ...
به متدهای این کد دقت کنید و روابط بین انها را درک کنید و سعی کنید جاهای خالی که با ...// مشخص شده را با کدهای مناسب پر کنید.
به نظر من که این اسکلت بندی، کاملاً چهارچوبی را که بارها سعی کردم برایتان تشریح کنم نشان و به نظرم خودم خیلی واضح است!
اگر این کد تکمیل شود با دستوری مثل این میتوانید یک اطلاعات را به IP+Port ای خاص ارسال کنید و هندلر عددی (چیشری شبیه کلید یا شماره پیگیری) برای دفعات بعدی بگیرید که با ان هدلر عددی میتوانید مجدد به همان مقصد قبلی اطلاعات ارسال کنید یا اطلاعات رسیده از همان مقصد را ردیافت کنید.کد:public class ConnectionManager<TSendData, TReceiveData>
{
//________________________________________
private System.Collections.Generic.IDictionary<long, Connection> m_Connections;
private static ConnectionManager<TSendData, TReceiveData> m_Current;
//________________________________________
private ConnectionManager()
{
//...
}
//________________________________________
public long Send(System.Net.EndPoint Point, TSendData data)
{
//Validation... return 0;
var con = new Connection(Point);
long key = this.GetFreeKey();
lock (this.m_Connections)
{
this.m_Connections.Add(key, con);
}
con.AddToSend(data);
return key;
}
//________________________________________
public bool Send(long key, TSendData data)
{
//Validation... return false;
Connection con;
lock (this.m_Connections)
{
if ((!this.m_Connections.TryGetValue(key, out con)) || (con == null)) return false;
}
con.AddToSend(data);
return true;
}
//________________________________________
private long GetFreeKey()
{
long ret = 0;
//...
return ret;
}
//________________________________________
public TReceiveData[] ReadAllNewReceived(long key)
{
//Validation return null;
Connection con;
lock (this.m_Connections)
{
if ((!this.m_Connections.TryGetValue(key, out con)) || (con == null)) return null;
}
return con.ReadAllNewReceived();
}
//________________________________________
public void Close(long key)
{
//Validation... return;
Connection con;
lock (this.m_Connections)
{
if (!this.m_Connections.TryGetValue(key, out con)) return;
this.m_Connections.Remove(key);
}
if (con == null) return;
con.Dispose();
}
//________________________________________
public int Count
{
get
{
lock (this.m_Connections)
{
return this.m_Connections.Count;
}
}
}
//________________________________________
public static ConnectionManager<TSendData, TReceiveData> Current
{
get
{
if (m_Current != null) return m_Current;
var app = System.Web.HttpContext.Current.Application;
m_Current = app["ConnectionManager"] as ConnectionManager<TSendData, TReceiveData>;
if (m_Current != null) return m_Current;
try
{
app.Lock();
if (m_Current != null) return m_Current;
m_Current = new ConnectionManager<TSendData, TReceiveData>();
app["ConnectionManager"] = m_Current;
return m_Current;
}
catch (Exception ex)
{
//Error...
return m_Current;
}
finally
{
app.UnLock();
}
}
}
//________________________________________
private sealed class Connection
: System.IDisposable
{
//________________________________________
public System.Net.Sockets.Socket m_Socket = null;
public System.Net.EndPoint m_Point;
public System.Collections.Generic.IList<TReceiveData> m_Recieve = null;
public System.Collections.Generic.Queue<TSendData> m_Send = null;
//...
//________________________________________
public Connection(System.Net.EndPoint Point)
{
this.m_Point = Point;
//... Open ...
this.StartReceiveData();
}
//________________________________________
private void StartReceiveData()
{
//...
}
//________________________________________
public void AddToSend(TSendData obj)
{
//Validation...
lock (this.m_Send)
{
this.m_Send.Enqueue(obj);
}
this.CheckForStartSending();
}
//________________________________________
public TReceiveData[] ReadAllNewReceived()
{
lock(this.m_Recieve)
{
int iCount = this.m_Recieve.Count;
if (iCount <= 0) return null;
var ret = new TReceiveData[iCount];
this.m_Recieve.CopyTo(ret, 0);
this.m_Recieve.Clear();
return ret;
}
}
//________________________________________
private void CheckForStartSending()
{
//...
//return;
//...
this.StartSending();
}
//________________________________________
private void StartSending()
{
//...
}
//________________________________________
public void Dispose()
{
//...
this.m_Socket.Dispose();
//...
System.GC.SuppressFinalize(this);
}
//________________________________________
}
}
به راحتی میتوانید پس از اولین درخواست این هندلر عددی را در ViewState یا Session و... کاربر قرار دهید و Send و Receive را با داشتن آن انجام دهید ...
کدهایی مثل اینها:
میبینید که استفاده بسیار ساده و روشن و شفافی دارد.کد:long keyhandler = ConnectionManager.Current.Send(EndPoint, Data);
if (keyhandler == 0) ... error ...
session یا viewstate در keyhandler ذخیره
//...
//...
//...
long keyhandler;
keyhandler خواندن مجدد
bool ok = ConnectionManager.Current.Send(keyhandler, NewData);
ReceiveDataType[] arr = ConnectionManager.Current.ReadAllNewReceived(keyhandler);
//...
درپایان
ConnectionManager.Current.Close(keyhandler);
این روش پیاده سازی مشکل از حوزه خارج شده و جمع آوری را هم ندارد.
ولی بحرحال برنامه شما در حوزه WebApp و از ریسمان اولیه IIS اجرا میشود.
بدیهی است که ...
1) شامل مجوزهای تایین شده برای دامین سایت شما میشود.
2) IIS و Framework2,3 اگر برای مدتی هیچ فردی به سایت شما متصل نشود و هیچ درخواستی به سایت شما نرسد در جهت افزایش بازدهی سرور و نیز کارکرد بهتر سایت خود شما کلاً سایت شما را از RAM خارج و Down میکنند.
(البته راه حلی در Framework4 در نظر گرفته شده)
در نتیجه نیتوانید انتظار داشته باشید وقتی که کاربری هم درسایت شما نیست، اجرای کدها و دستورات برای مدت زیادی ادامه یابد.
=====
اگر سوالی در مورد متدهای فوق و کاری که انجام میدهند یا باید انجام بدهند داشتید، مطرح بفرمائید.
شاید کمی کار داشته باشم ولی یا جایی که وقت و سوادم اجازه دهد در خدمت هستم.
موفق باشید.