שאלה בתקשורת - socket...

  • פותח הנושא dc24
  • פורסם בתאריך

dc24

New member
שאלה בתקשורת - socket...

שלום ע"מ ללמוד קצת על תקשורת בדוט נט ניסיתי ליצר תוכנת שרת-לקוח קטנה, תוך שימוש ב-socket. נתקלתי בבעיה שאשמח אם מישהו יוכל לעזור או לתת רעיונות. אז ככה : בשרת יש thread (להלן פרוסס) שאחראי על האזנה לחיבור של קליינטים, ואז יוצר אובייקט שאחראי על כל התקשורת עם אותו לקוח, וממשיך להאזין לאחרים. באותו אובייקט שנוצר אני משתמש בתקשורת אסינכרונית (שימוש ב-BeginReceive וב- EndRead)- ככה אני ממשיך להאזין כמו שצריך. בקליינט אני גם משתמש בתקשורת אסינכרונית. ההודעות הן רק טקסט, כאשר התוים הראשונים מסמנים את סוג ההודעה, תו מפריד ואז גוף ההודעה. הבעיה שמצאתי היא שכאשר, למשל, השרת שולח מספר הודעות ברצף ללקוח מסוים אז לעיתים ההודעות מגיעות בנפרד (ולכן אני יודע את סוג ההודעה לפי הטקסט ההתחלתי שלה) אך לעיתים מתקבלות מספר הודעות ברצף, ז"א ששתי הודעות או יותר "מתחברות" והלקוח מקבל רק הודעה אחת - המכילה את שתי ההודעות. ככה אני לא יודע מה סוג ההודעה השניה. מעבר לכך - לפעמים הגיעה הודעה שהיא למעשה בנויה משתי הודעות שלמות ומחצי הודעה שלישית, ועוד הודעה שבנויה מהחצי השני של ההודעה השלישית. הגדלתי את גודל ההודעה (גודל ה-buffer) אבל זה פתר רק את הבעיה השניה. מישהו יודע איך אני פותר את זה ? חשבתי על סימן מיוחד שיהיה בסוף כל הודעה אבל אני לא יודע איך אפשר לבקש קריאה של הודעה עד תו מסוים. אשמח לקבל כל רעיון ופתרון שעולה לכם בראש. תודה רבה ושבת שלום. DC
 

dc24

New member
עוד משהו קטן שלא ציינתי

כשאני שולח מספר הודעות ברצף אני מבצע flush אחרי כל הודעה וגם sleep של מספר מילי שניות (5).
 

d_style

New member
הדרך לפיתרון

1. בתחילת כל הודעה, כתוב את האורך שלה, כך תדע אם היא הגיעה בשלמותה. 2. כל מידע שמגיע מהsocket, תוסיף אותו לbuffer שלך. 3. בדוק כל פעם האם מחכה לך הודעה שלמה בbuffer (תשתמש בגודל של ההודעה הנ"ל). אם מחכה לך הודעה, טפל בה, ועבור על כל ההודעות האחרות שממתינות. אל תשכח למחוק את הbuffer ברגע שטיפלת בכל ההודעות שמחכות לך בו. בנוסף, על מנת להוסיף מידע לbuffer שלך, תוכל להשתמש בפונקציית append שתידאג גם להגדיל את גודלו של הbuffer בהתאם למידע שאמור להיכנס אליו. בהצלחה.
 

dc24

New member
תודה על התגובה.... שאלה ...

לפי מה שהבנתי - BUFFER זה STRING או STRINGBUILDER, נכון ? תודה רבה עזרת לי מאוד
 

d_style

New member
עקרונית

תוכל להשתמש בStringBuilder (בשום פנים ואופן לא בstring - משיקולי יעילות). אבל מה שאתה באמת מחפש זה Buffer שידע לטפל בByteArray. הכי פשוט להגדיר Array מסוג Byte ובכך פתרת את העניין, למרות שיש גם מחלקות יותר מתוחכמות במיוחד לצורך זה. חפש בגוגל.
 

dc24

New member
אבל אז

אבל אז אני אצטרך כל הזמן להגדיל את המערך, וכאשר אני מטפל בהודעה אז אצטרך להסיר את האיברים הראשונים ולצמצם רווחים. נראה שתור יתאים. השאלה היא האם אובייקט תור (queue) יעיל יותר ממחרוזת.
 
למעלה