[c#] סוקטים - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

[c#] סוקטים


-LosNir-

Recommended Posts

  • תגובות 35
  • נוצר
  • תגובה אחרונה

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

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

קישור לתוכן
שתף באתרים אחרים

תודה רבה לכם.

אני כבר הצלחתי לעשות תוכננת צ'אטים אבל כל פעם שנלשחת הודעה אותה ההודעה נשלחת לקובץ ב WS ושהוא שומר אותו על השרת בקובץ txt,

והקליינטים כל פעם מנסים לקחת את ההודעה כל 100 מאיות שניה ב timer וזה מציק ותוקע את כל הרשת :D

הקטע של המשתמשים זה לא בעיה ניראה לי,

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

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

אני אנסה את זה ברגע שהמחשב שלי יחזור לחיים :)

קישור לתוכן
שתף באתרים אחרים

מזה "מנסים לקחת"?

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

השיטה בה אתה עובד שגויה ביותר ולא תוכל לעמוד בעומס של משתמשים,

כפי שציין UI אתה צריך לעבוד לפי סדר מסויים: נשלחת הודעה לשרת, השרת רץ על האוסף של כל המשתמשים ולכל אחד שולח את ההודעה (כמובן פעולה זאת גם בת'רד נוסף ע"מ למנוע תקיעות תוכנה) בנוסף אתה ממש טוחן IO שזה לא סביר בכלל עבור תוכנה שלא אמורה בכלל לשמור את ההודעות (אלא אם אתה מעוניין ב LOG ) ואז לרשום את הכל לתוך קובץ אחד ולא הרבה קבצים.

כמו כן, מומלץ לעבוד א-סיכרוני בשביל יישום נכון של האפליקציה (לעבוד עם begin ו end)

קישור לתוכן
שתף באתרים אחרים

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

קישור לתוכן
שתף באתרים אחרים

אנשים בואו נעשה סדר!

UI, עשית כאן סלט שלם :lol:

אני בכל ללא עובדים על סוקטים,

תקרא שוב, אני אמרתי שיש לי תוכנה שכרגע עובדת על WS.

ברגע שנשלחת הודעה, התוכנה עושה fetch לדף ב PHP, הדף הזה מעבד את ההודעה שנשלחה ומכניס אותה לקובץ msgs.txt ומוחק אחרי 150 מילישניות.

הקליינטים, מכניס לתיבת הודעות את התוכן שב msgs.txt כל 100 מילישניות.. ככה שנלשחת הודעה זה נכנס ל msgs.txt, בנתיים כל הקליינטים תופסים את ההודעה ואז השרת מוחק :)

מבין?

"השרת" הוא כביכול קובץ PHP מרוחק שאני עושה לו fetch


[url]http://www.losnir.net/shellim/message.php?msg=msg[/url]....

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

אז אני רוצה לשדרג אותה לסוקטים :)

הבנתי את הדוגמא של הכוכב..

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

ד"א, מזה ת'ראד? :S

קישור לתוכן
שתף באתרים אחרים

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

ת'רד זה בעצם כמו מסלול תוכנה (אין לי דרך אחרת להסביר את זה) נגיד התחלת תוכנה יש מחלקה שנקראת Thread אשר מגיעה מה namespace

system.threading

כאשר אתה פותח אובייקט ת'רד אתה נותן לו פונקציה שממנה הוא מתחיל, הת'רד את הפונקציות במקביל לתוכנה המרכזית (מה שמתחיל מה main )

וככה תוכנה אחת יכולה לעבוד על כמה פונקציות באותו זמן כביכול (כל ת'רד מקבל זמן CPU בנפרד)

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

התקדמתי עם התוכנה החדשה,

עשיתי קליינט ושרת.

הקליינט כביכול מוכן, והשרת רץ.

הבעיה שני לא מצליח לעשות Listen לבקשות, הינה הקוד:


// Set status
lbl_Statusvalue.Text = "Initializing...";

// Set the TcpListener
Int32 port = 12500;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");

// TcpListener server = new TcpListener(port);
TcpListener server = null;
server = new TcpListener(localAddr, port);

// Start TcpListener and change status
lbl_Statusvalue.Text = "Ready.";
server.Start();

קישור לתוכן
שתף באתרים אחרים

את מה שרשמת אני צריך לשים בתראד משלו נכון?

אני פשוט לא מצליח לעשות תראד.. :|

אפשר דוגמא.. אפילו לא כ"כ הבנתי מזה..

תודה :)

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...