PracticU

Streaming

בלי כתוביותעם כתוביות
PracticU › קורס WCF - תקשורת למתקדמים בדוט-נט › Streaming
מילון מושגים:
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.
דיבאג - תהליך של איתור, הבנה ותיקון תקלות בקוד, לעיתים בעזרת כלי שמאפשר לעצור ולעקוב אחר ריצת התוכנית.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
כפתור - רכיב בממשק המשתמש שהמשתמש לוחץ עליו כדי להפעיל פעולה, כמו שליחת טופס או מעבר לדף אחר.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.

Streaming
סטרימינג מאפשר ללקוח להתחיל לקרוא או לצפות במידע בזמן שהשרת עדיין שולח אותו. השרת פותח FileStream על הקובץ ומחזיר אותו ללקוח, והחיבור נשאר פתוח עד שסוגרים אותו. זו הדרך המתאימה לקבצי וידאו גדולים, בדומה למה שקורה ביוטיוב.
שירות הווידאו
1. ספרייה חדשה: Video Manager Library, עם הממשק IVideoManager. הפונקציה GetVideoNames מחזירה את שמות הסרטונים, והפונקציה DownloadVideo(string videoName) מחזירה Stream. שתיהן מסומנות ב-ServiceContract וב-OperationContract.
2. שמות בלבד: השרת מחזיר ללקוח רק את שמות הקבצים, בלי הנתיב שבשרת.
3. תיקיית הווידאו: המחלקה GlobalProperties (internal ו-static) מכילה את הנתיב. בעזרת #if DEBUG ו-#else הנתיב נקבע לפי מצב הבנייה: בפיתוח התיקייה נמצאת בתיקיית הפרויקט, וב-Release היא נמצאת ליד קובץ ההרצה. הקוד שבאזור שלא נבחר לא נכנס לקובץ ההרצה בכלל.
4. פתיחת הסטרים: DownloadVideo פותחת FileStream על הקובץ ומחזירה אותו. השרת לא סוגר את הסטרים, כי הוא צריך להישאר פתוח בזמן שהלקוח קורא.
ההוסט והביינדינג
5. Host: מוסיפים הפניה לספרייה ב-Console, ויוצרים שירות חדש ב-WCF Configuration Editor, עם Basic HTTP בכתובת 127.0.0.1, פורט 6066 והנתיב הווירטואלי videos.
6. Binding לסטרימינג: ב-Binding Configuration מגדירים באפרים גדולים (כחמישה מיליון), MessageEncoding מסוג Mtom, ו-TransferMode = Streamed, במקום Buffered. בלי הגדרה זו הלקוח מחכה לקובץ כולו לפני שהוא מתחיל לקרוא.
הלקוח (WPF)
7. למה WPF: אפשר להשתמש ברכיב MediaElement פשוט, בלי רכיבי צד שלישי, והווידאו נראה טוב גם בהקלטה.
8. הממשק: DockPanel שבו StackPanel עליון עם Label, ComboBox בשם cboVideos, כפתור Show, ו-MediaElement בשם myPlayer עם LoadedBehavior = Manual, כדי שהנגינה תתחיל רק בלחיצה.
9. טעינה: בבנאי של החלון הלקוח פונה לשירות, מוסיף את שמות הסרטונים לקומבו ובוחר את הראשון.
10. הורדה והצגה: בלחיצה על Show פותחים FileStream לכתיבה לקובץ מקומי, ואז לולאה שקוראת מהסטרים מנות של 4096 בתים (Read) וכותבת אותן (Write). ברגע שיש מידע בקובץ מתחילים לנגן עם myPlayer.Source = new Uri(path, UriKind.Absolute) ו-Play(), בזמן שההורדה ממשיכה.
11. סגירה: הסטרים שמגיע מהשרת נסגר בעזרת using, כי הלקוח אחראי לסגור אותו.
כך הסרטון מתחיל להתנגן לפני שכל הקובץ ירד.
השיעור הבא בקורס: מושגי יסוד ב-Security

פרקי ההרצאה: Streaming

  1. 00:00

    סטרימינג להורדת וידאו מהשרת

  2. 01:49

    ספריית Video Manager וממשק משותף

  3. 02:53

    הפונקציות GetVideoNames ו-DownloadVideo

  4. 03:48

    חשיפת הממשק עם Service Contract

  5. 04:28

    מימוש המחלקה Video Manager

  6. 05:16

    שליפת שמות הסרטונים מתיקיית הוידאו

  7. 06:45

    שמות ידידותיים ללא נתיב השרת

  8. 08:11

    תיקיית bin ושמירת קבצים לזמן ההרצה

תמלול ההרצאה: Streaming

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

  1. 00:20

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

  2. 00:46

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

  3. 01:18

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

  4. 01:35

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

  5. 01:49

    אז לצורך כך אנחנו הולכים להעביר שרטון וידאו מהשרת ללקוח ולצפות בו בואו נצרף dll חדש עבור ה-wcf סרוויס שלנו. אז נלך ל-add new project, נבחר ב-class library ונגדיר לו שם משמעותי, לדוגמה video manager library.

  6. 02:21

    נלחץ אישור ונשאר לנו לבנות ב-dll הזה את האינטרפייס. אז נצרף אינטרפייס חדש, add a new item, נבחר אובייקט אינטרפייס, נגדיר לו את ההגדרות המתאימות.

  7. 02:39

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

  8. 03:07

    נקרא לפונקציה הזאת get video names. פונקציה שנייה זאת הפונקציה שתחזיר לנו סטרין לוידאו שנבחר. ולכן היא תחזיר לנו אובייקט סטרין.

  9. 03:30

    נקרא לפונקציה הזאת DownloadVideo שהיא תקבל את ה-VideoName. אוקיי, עכשיו אנחנו צריכים להגדיר את ההגדרות המתאימות עבור האטריביוטס שחושפים את הממשק ואת הפונקציות, ואנחנו רוצים לגשת ל-System.ServiceModel הנה הוא כאן, נצרף אותו ונגדיר Service Contract ונגדיר

  10. 04:10

    מעל כל פונקציה Operation Contract. ניפטר מכל מרחבי השמות המיותרים וסיימנו לבנות את האינטרפייס. כעת אנחנו יכולים ללכת לקלאס ולבנות את המחלקה שתחזיר את ה-Stream.

  11. 04:39

    בואו נקרא למחלקה הזאת "וידאו מנאג'ר". אנחנו יכולים לגשת לקובץ שלה, זה פה. דבר ראשון, נראה שאת הממשק "i video manager" קונטרול נקודה ואנטר יממש את הפונקציות.

  12. 05:04

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

  13. 05:25

    ניקח כאן מערך מכרוזות, נקרא לו full path files ונקבל את כל הקבצים מאיזושהי תיקייה. התיקייה שאנחנו רוצים לקבל את הקבצים זאת התיקייה הנוכחית, לגשת אליה זה על ידי ApplicationStartupPath, אבל אנחנו צריכים בשביל זה לצרף ל-reference.

  14. 05:56

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

  15. 06:29

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

  16. 07:01

    אז לצורך כך String, נעשה דברים דומים לדברים שעשינו בסרטון של התמונות. יש לי פה File Names New String, נלך וניקח את אותו הגודל Full Path Length ונרוץ על Full Path Length ופשוט נאתר רק את השם של הקובץ.

  17. 07:31

    לצורך כך נשתמש במחלקה File Info. שתתלבש על קובץ שיש לו full path ואז רק בפייל ניימס נכניס את השם שלו שהוא כולל גם את הסיומת פה בעצם אנחנו צריכים i בצורה כזאת ולבסוף נחזיר פייל ניימס אז הפונקציה get videos names מחזירה לי רק את השמות של סרטוני הוידאו שקיימים בשרת בתיקי הוידאו

  18. 08:20

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

  19. 08:43

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

  20. 09:09

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

לקורס המלא: קורס WCF אונליין בדוט-נט

ההרצאה הקודמת: Performance - MTOM

ההרצאה הבאה: מושגי יסוד ב-Security

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

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