PracticU

Client-Server Architecture - חלק 1

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מתקדם - #Advanced .NET C › Client-Server Architecture - חלק 1
מילון מושגים:
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
תהליך - מופע של תוכנה שרצה בזיכרון, עם הקוד, הנתונים והמשאבים שהוקצו לה על ידי מערכת ההפעלה.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
Namespace - מרחב שמות שמקבץ שמות של טיפוסים ורכיבים ומונע התנגשות בין שמות זהים בחלקים שונים של הקוד.

Client-Server Architecture - חלק 1
בשיעור הזה מתחילים לבנות ארכיטקטורת לקוח-שרת נכונה: שרת אחד שמשרת לקוחות רבים, כאשר כל לקוח מחובר לשרת דרך רכיב תקשורת משותף.
השלבים העיקריים
1. למה לא מספיק קליינט אחד: הדוגמה הקודמת הראתה את רכיבי התקשורת, אבל לא את הדרך לבנות מערכת שלמה שמשרתת הרבה לקוחות.
2. מנהל בשרת: השרת מכיל מחלקה מנהלת, שמתחילה את התהליך, ומחזיקה אוסף של כל הלקוחות המחוברים.
3. רכיב התקשורת: בצד הלקוח ובצד השרת נדרשים אותם דברים: סוקט, NetworkStream, פורמטר, האזנה בתרד נפרד ואפשרות לשלוח ולקבל. לכן מוציאים אותם למחלקה נפרדת, שנקראת Communicator, ומשתמשים בה משני הצדדים.
4. חיבור לכל לקוח: כשלקוח מתחבר, השרת מקבל סוקט חדש ויוצר עבורו Communicator נפרד שמדבר רק איתו. לכל לקוח יש קו תקשורת משלו, גם אם כל הלקוחות מתחברים מאותו מקום בעולם או ממקומות שונים.
5. העברה כלפי מעלה באירועים: ה-Communicator לא מכיר את המנהל או את הטופס שיצר אותו. לכן כשמתקבלת הודעה הוא מעלה אירוע, והמנהל או הטופס שנרשמו לאירוע מקבלים את ההודעה.
6. לוגיקה של המערכת: השלב הזה מכין את התשתית בלבד. מה עושים עם ההודעה מחליט המתכנת: לשלוח לכל הלקוחות, לשמור במסד נתונים, לחשב, או לשלוח רק לחלק מהלקוחות.
7. דוגמה לצ'אט: בשיעור מדגימים צ'אט פשוט. לקוח שולח הודעה לשרת, השרת שולח אותה לכל הלקוחות, כולל השולח, וכל הלקוחות מציגים את ההודעה.
8. מבנה הפתרון: Communicator נכתב כ-DLL משותף לשרת וללקוח, וכדאי שכל הפרויקטים יהיו תחת אותו Namespace (בשיעור: Chat).
בסיום השיעור ברור שהשרת מחזיק אוסף של Communicator, אחד לכל לקוח, ושהתקשורת בין הרכיבים נעשית באירועים, כדי שכל רכיב יעביר מידע רק למי שיצר אותו.
השיעור הבא בקורס: Client-Server Architecture - חלק 2

פרקי ההרצאה: Client-Server Architecture - חלק 1

  1. 00:00

    ארכיטקטורת Client Server נכונה

  2. 01:55

    ה-Manager וה-Collection בצד השרת

  3. 04:36

    מחלקת ה-Communicator המשותפת

  4. 06:24

    Communicator בצד השרת וה-Collection

  5. 10:27

    בניית מערכת צ'אט פשוטה

  6. 13:11

    העברת מידע ל-Manager בעזרת אירועים

  7. 16:56

    הקמת המערכת ו-Communicator Library

  8. 20:39

    בניית MessageEventArgs והאירוע GotMessage

תמלול ההרצאה: Client-Server Architecture - חלק 1

הטקסט המלא של הדקות הראשונות בהרצאה «Client-Server Architecture - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

    אחרי שראינו את הנפשות הפועלות בתחום ה-TCPIP מבחינת פיתוח התוכנה וראינו אילו רכיבים תכנותיים יש לנו לצורך ביצוע תקשורת נתונים ב-TCPIP אנחנו יכולים עכשיו לגשת ולראות Client Server Architecture כלומר ארכיטקטורה נכונה לבנייה של מערכת שבה יש שרת אחד שמשרת הרבה לקוחות כי הדוגמה שעשינו בסרטון הקודם בעצם הראתה

  2. 00:33

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

  3. 01:00

    משלבים את העבודה איתם לצורך יצירת מערכת שלמה שעובדת כמו שצריך אם טרדים ואם לא להיתקע ואם לשרת הרבה לקוחות ואיזושהי לוגיקה שקיימת בתוך המערכת.

  4. 01:15

    כמובן אנחנו הולכים להשתמש עם הכלים שלמדנו. אז קודם כל בהדגמה הזאת אנחנו הולכים לראות איך נכון לייצר את המערכת הזאת מבחינת design pattern ונתחיל עם שלבים שלבים ואז נבהיר כל דבר שיש כאן.

  5. 01:33

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

  6. 01:47

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

  7. 02:12

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

  8. 02:41

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

  9. 02:54

    אחלה. איזשהו בן אדם שנכנס ורוצה לגלוש לתוכנה. מה הוא עושה? מרים איזשהו, מריץ את התוכנה, נפתח לו נניח איזשהו טופס שאיתו הוא יתחיל, אמור להתחיל לעבוד עם השרת מה אנחנו רוצים לעשות אנחנו רוצים בדיוק במקום הזה כשהוא רוצה להתחיל לעבוד עם השרת שלנו אנחנו רוצים להשתמש ברכיבים שהיו בהדגמה הקודמת ובצד של הקליינט הרי יש לנו tcp קליינט

  10. 03:30

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

  11. 03:58

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

  12. 04:23

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

  13. 04:36

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

  14. 04:59

    מה שיהיה בתוך הקומיוניקייטור זה בעצם הדברים שיהיו משותפים גם לקליינט וגם לסרבר מבחינת תקשורת הנתונים.

  15. 05:08

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

  16. 05:33

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

  17. 05:59

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

  18. 06:25

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

  19. 06:52

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

  20. 07:28

    אז יש לנו עכשיו לקוח אחד שמחובר לשרת ובשרת יש אובייקט קומוניקטור שמחובר רק לאותו לקוח. עכשיו, אמרנו השרת נמצא בארצות הברית, הלקוח הראשון שראינו נמצא בישראל, אין בעיה.

  21. 07:45

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

  22. 08:14

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

  23. 08:32

    כאן יש קו תקשורת בין שני הקומוניקטורים השניים, לא קשורים לקו תקשורת של הקומוניקטורים הראשונים. עכשיו, לשרת יש גישה לשני לקוחות.

  24. 08:49

    אוקיי, זה היה מאיטליה. בא עוד לקוח מספרד, אין שום בעיה, פותח את הטופס שלנו, מיידית אנחנו מייצרים לו Object Communicator, מיידית אנחנו יוזמים בקשת התחברות לשרת, השרת מקבל את הסוקט, פותח קומוניקטור שלישי, מצרף אותו לקולקשן

  25. 09:09

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

  26. 09:28

    מה אתם רוצים לבנות? האם אתם רוצים לבנות איזשהו משחק שבו הלקוח הראשון, נניח ההוא מישראל, ושולח איזה חידה והחידה מגיעה רק ללקוח אחד רנדומלי שצריך לפתור אותה ולהחזיר לו תשובה דרך הסרבר?

  27. 09:52

    האם אתם רוצים שתהיה לכם איזושהי תוכנה נניח שמנהלת קבצים כמו לדוגמה דרופבוקס וכל לקוח הוא מתקשר רק עם השרת בפני עצמו ולא קשור ללקוחות אחרים?

  28. 10:07

    האם אתם רוצים שלקוח ישלח הודעה לדוגמה כמו צ'אט וההודעה תחזור לכל הלקוחות? זה כבר הלוגיקה שלכם. מה בדיוק קיים בפרויקט שלכם? אתם צריכים לבנות את הלוגיקה הזאת לפי מה שנכון לכם.

  29. 10:27

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

  30. 10:50

    אוקיי, אז אם הלקוח מישראל בא ושולח את ההודעה, מה אנחנו רוצים לעשות? אנחנו רוצים שההודעה תגיע לאזור של השרת, ואנחנו רוצים שאיכשהו ההודעה הזאת תצליח להישלח לכל הלקוחות, כמובן כולל הלקוח ששלח את ההודעה, כי גם אליו אנחנו רוצים שההודעה תחזור ותוצג.

  31. 11:13

    ככה הוא לדוגמה יודע שעדיין הקו תקשורת פעיל לדוגמה. אז בואו נראה. הלקוח הראשון מישראל כותב את המילה לוחץ הלחצן שלח והמילה Hello צריכה להגיע לקומיוניקטור.

  32. 11:31

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

  33. 11:50

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

  34. 12:09

    קורא לה, שולח את המידע, אחלה. מה הקומיוניקטור עושה? פורמטר. נקודה סריאלייז. שולח את המחרוזת הזאת לצד השני.

  35. 12:20

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

  36. 12:40

    למה למנאג'ר? מפני שהמנאג'ר הוא זה שמכיר את הקולקשן ואת כל הקומוניקטורים בתוך הקולקשן. לכן הוא חייב להעביר את המחרוזת שהוא קיבל למנאג'ר.

  37. 12:54

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

  38. 13:11

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

  39. 13:27

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

  40. 13:44

    ומי שיצר אותו צריך פשוט להאזין לאיבנט ולקבל את האיבנט. אוקיי, אז המנאג'ר קיבל עכשיו את ההודעה ומה המנאג'ר רוצה לעשות?

  41. 13:56

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

  42. 14:09

    זה אומר שהמנאג'ר צריך לרוץ באיזושהי לולאה, לגשת לכל קומוניקטור ועל ידי פונקציית send לשלוח את המידע כי המנאג'ר מכיר את הקומוניקטור. אז פה יש לנו סוויץ' כזה והקומוניקטור פשוט לוקח את אותה הודעת הלו שכרגע הגיעה אליו ושולח את זה לכל אחד מהקומוניקטורים.

  43. 14:30

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

  44. 14:46

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

  45. 15:13

    שרת לקח את ההודעה שלח אותה לכל הלקוחות כולל הלקוח עצמו וההודעה הגיעה לכל הלקוחות שמחוברים כרגע גם להוא בישראל גם להוא באיטליה גם להוא בספרד והטפסים עשו מה שהם רוצים לדוגמה הציגו את ההודעה מציגים אותה בליסטווקס או איפה שאתם רוצים

  46. 15:34

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

  47. 16:04

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

  48. 16:16

    אז מה שאנחנו הולכים לעשות זה פשוט להרים את כל המערכת הזאת מאפס, כאשר אנחנו הולכים לעשות בדיוק את מה שראינו בפרזנטציה הזאת. איזשהו צ'אט פשוט שלקוח אחד שולח את ההודעה לשרת, מחזיר את ההודעה הזאתי לכל הלקוחות המחוברים כולל הלקוח ששלח את ההודעה וכולם מוסיפים את ההודעה הזאת לאיזשהו ליסט וככה כל הלקוחות יכולים לתקשר עם כולם.

  49. 16:50

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

  50. 17:19

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

  51. 17:28

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

  52. 17:37

    אז בואו נקרא ל-DLL הזה Communicator Library, נבצע פה אוקיי, ואנחנו בעצם מצרפים DLL אחד ל-Solution. והדבר הראשון שאנחנו תמיד עושים כשאנחנו מצרפים DLL זה משנים את ה-Namespace.

  53. 18:01

    בואו נקרא ל-Namespace הזה Chat, מפני שאנחנו רוצים שיהיה לנו Namespace אחד ויחיד עבור כל המערכת שלנו. נקרא לו Chat. אוקיי, יש לנו פה איזושהי מחלקה ואנחנו רוצים לעשות בדיוק את מה שהיה בסרטוט נקרא לה com, נשנה את השם של המחלקה ל-com, שימו לב שהיא public בכדי שנוכל להשתמש איתה

  54. 18:27

    מחוץ ל-dll. יופי, מה אנחנו רוצים במחלקה הזאת? המחלקה הזאת הייתה אמורה להיות הרכיב של הקומוניקטור שמתקשר.

  55. 18:38

    אז מה אנחנו צריכים שיהיה לנו? אז אנחנו צריכים מספר דברים שראינו שהם משותפים גם לסרבר וגם לקליינט ואנחנו הולכים לבנות אותם כ-data members.

  56. 18:49

    יש לנו פה את אובייקט ה-socket, יש לנו את אובייקט ה-network stream, יש לנו את אובייקט ה-formatter, יש לנו כאן איזשהו טרד שאנחנו נצטרך לצורך האזנה להודעות, מפני שאם אתם זוכרים, האזנה זה blocking operation, פקודה דה סריאלייז פשוט תאזין לסטרים ולסוקט ותיתקע עד שמישהו לא ישלח לי מהצד השני מידע ובגלל שזאתי פקודת

  57. 19:40

    בלוקינג אופריישן אני חייב בשביל לשחרר את התוכנית להאזין עליה בתרד נפרד. אז בואו ניקח פה תרד נקרא לו listening thread ואני רק מכין את הקרקע ודבר נוסף שאנחנו נצטרך זה את הקונספט של בואו קודם כל נסגור את התרד וניקח כאן איזשהו משתנה, נקרא לו Keep Listening בכדי שנוכל לרוץ עליו

  58. 20:15

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

  59. 20:39

    לכן אם אני רוצה אירוע שידווח סטרינג אנחנו צריכים לגשת ולבנות מחלקת event args עבור סטרינג אז בואו נצרף פה קלאס ונקרא לקלאס הזאת message event args כמו שאתם רואים זה בעצם הדגמה שהיא כוללת בתוכה המון מרכיבים שנלמדו במהלך הקורס הזה וגם במהלך קורסים ישנים יותר כמו קורס object oriented לדוגמה המחלקה כמובן חייבת להיות public היא יורשת את

  60. 21:14

    event args נגדיר פה public read only כאן יש לנו string message מה ההודעה שאנחנו רוצים להעביר זה המסג' שלנו ניקח פה איזשהו קונסטרקטור שמקבל מסג' ופשוט נכניס את המסג' לדאטה ממבר מסג' ופה סיימנו לבנות את ה-event args כמחלקה נפרדת אפשר לסגור את הקובץ הזה ולחזור לכאן ולבנות את האירוע האירוע שלנו הוא public event handler מסוג

  61. 22:00

    message event args נקרא לו got message כי ברגע שיתקבל הודעה מהצד השני של העולם אנחנו רוצים להעלות את ההודעה הזאת באירוע ולציין תקשיבו קיבלנו הודעה קחו את המידע קחו את הודעה תעשו איתה מה שאתם רוצים אוקיי בואו ניקח כאן איזה שהוא ניקח כאן איזה שהיא פונקציית קונקט public void

  62. 22:30

    קונקט ואולי ניקח גם איזה שהוא ציטור שיהתחל לנו את הפורמטר אני חושב איתכם תוך כדי שאני בונה את זה new binary formatter keep listening יהיה true האמת שזה יותר הגיוני שזה יהיה בקונקט ובואו נחשוב מה אנחנו רוצים לעשות קונקט בשביל לבצע התחברות לצד השני אתם צריכים להביא לי סוקט הנה סוקט וברגע שאתם

  63. 23:10

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

  64. 23:38

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

  65. 24:09

    ואנחנו יכולים לבצע קו תקשורת איתו. כל מה שאנחנו צריכים לעשות, סוקט שווה סוקט, מכניסים אותו לדאטה ממבר, אפשר עכשיו לפתוח את הנטוורק סטרים על הסוקט הזה, פורמטר כבר בנינו, אפשר לבוא ל-Listening Thread ולהצביע על איזושהי פונקציה

  66. 24:40

    Listen to Messages, אנחנו כבר הולכים לבנות אותה. ה-Listen Thread הגיוני שהוא יהיה Background,

לקורס המלא: קורס תכנות מתקדם ב‑#C ודוט-נט

ההרצאה הקודמת: תרגילים על C# - TCP / IP

ההרצאה הבאה: Client-Server Architecture - חלק 2

הרצאות קשורות מקורסים אחרים

  • Client-Server Projects
  • הדגמה של NAP Client
  • Linux Container on Server 2019
  • התקנה ידנית של SCCM CLIENT

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס WCF - תקשורת למתקדמים בדוט-נט