עבור לתוכן

פיתוח צ'ט וובי פשוט עם JSP - צריך עזרה בהבנת ה- flow

Featured Replies

פורסם

אהלן,

פיתחתי לא מעט בשפות עילית (בעיקר ג'אווה) והתחלתי לאחרונה להתעניין בפיתוח ב-WEB.

אני מנסה לבנות צ'ט פשוט מבוסס WEB ומרוב מושגים ואופציות נראה לי שיש לי בלגאן בראש ולא ברור לי איך אני צריך לממש את העניין.

מה שיש לי כרגע:

- HTML עם קצת JSP של מסך הכניסה הראשוני (המשתמש מקליד שם משתמש ומנווט הלאה לחלון הבא).

- HTML עם קצת JSP של חלון הצ'ט הבסיסי הראשוני (שורת כתיבה וחלון שיחה המתעד את התכתובת בין המשתמשים).

יש לי כמה שאלות לגבי ה-JSP:

איפה אני ממש את ה-doPost ו-doGet? אני צריך לבנות סרבלטים נפרדים בשביל זה או שאפשר לממש אותם בגוף ה-JSP כקוד ג'אווה?

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

לפי מה שראיתי ישנן כמה דרכים לעשות את זה (לפי comet programming), האם יש העדפה מתאימה לצורך מימוש צ'ט?

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

JSP מציע אובייקט application שהוא משותף לכל הקליינטים וניתן לשים על ערכים (attributes + values). האם הוא יכל לעזור לי פה?

ישנה גם אופציה להתשמש ב-javabeans כדי לשמור את יומן השיחה, האם זו אופציה מתאימה?

לפי הבנתי אצטרך להתשתמש ב-AJAX בצד ה-client כדי שאוכל לעדכן את חלון השיחה (בלי לרענן את כל הדף). אם אני משתמש ב-AJAX כדי ליצור בקשה (XMLHttpRequest) ישירות ל-servlet (שעוד אצור בהמשך..) מה בעצם התפקיד של ה-JSP אם כך?

בקיצור, 3 שאלות:

1. מה הדרך המתאימה ליצירת push מהשרת לכל הקליינטים שמחוברים אליו?

2. מה הדרך המאימה לשמירת יומן השיחה בצד השרת (מתעדכן מהקליינטים בכל פעם שקליינט שולח הודעה)?

3. איך מחברים את כל הסלט הזה של AJAX, Servlets & JSP (קונספטואלית)?

בתודה מראש,

יוגב

פורסם

קומט היא אכן השיטה הטובה ביותר שמאפשרת תמיכה רחבה ללא תוספות כל שהן לדפדפן (שיאפשרו תקשורת בצורת socket):

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

השיטה שעובדת עבור כולם בעקביות היא long pulling - שמשמעה ביצוע של שאילתת HTTP באמצעות AJAX שאינה

נסגרת כל עוד לא התקבלה תשובה עליה. בצד השרת זה מתאפשר על ידי עיקוב מלאכותי של המענה על הבקשה (לולאה ופקודה כמו sleep)

עד שיש משהו להחזיר (הבחור שמדבר איתך כתב משהו חדש).

בצד הדפדפן - אם לא מתקבלת תשובה והבקשה נסגרה עקב time-out יש לפתוח בקשה חדשה כזו מייד.

עקב המורכבות של ישום התהליך, ישנם ספריות שפותחו שעושים את רוב העבודה הקשה בשבילך, גם בצד הדפדפן וגם בצד השרת - למשל - http://cometdproject.dojotoolkit.org/documentation/bayeux

הנה התהליך שבאמצעות תוכל לממש את הצאט בצורה הכללית ביותר:

קוד גוואה סקריפט שמבצע בקשה לשרת באמצעות AJAX לסרבלט.

הסרבלט בודק האם נכתבו הודעות חדשות ללקוח. על הסרבלט לא להחזיר תשובה עד שאכן נכנסה הודעה

חדשה שאותה יקרא ממסד נתונים או אמצעי אחסון אחר.

במידה והוחזרה תשובה יש להציג אותה בצאט ולפתוח בקשה חדשה כמתואר לעיל, במידה ואין והבקשה הגיע ל time-out

יש לפתוח בקשה חדשה כמתואר לעיל.

כאשר המשתמש כותב משהו לצאט - יש לבצע בקשת ajax לסרבלט שיכניס את ההודעה החדשה למסד הנתונים.

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

כגון דאטא בייס.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים