עבור לתוכן

[c#] סוקטים

Featured Replies

פורסם

שלום,

רציתי לדעת איך אפשר לעשות סוקטים,

ז"א כמו P2P בין 2 תוכנות (שלי).

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

תודה.

  • תגובות 35
  • צפיות 5.8k
  • נוצר
  • תגובה אחרונה
פורסם

יש לך את TcpClient וTcpListener ב- System.Net.Sockets.

אתה צריך לשמור רשימה כלשהי(אולי arraylist) של המשתמשים, וכל פעם שהשרת שלך מקבל הודעה, הוא צריך לשלוח אותה לכולם.

פורסם

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

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

פורסם
  • מחבר

תודה רבה לכם.

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

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

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

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

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

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

פורסם

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

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

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

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

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

פורסם

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

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

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

פורסם

עדיף לך להשקיע שעה, וללמוד איך להשתמש בWCF - יחסוך לך המון עבודה!

פורסם

מיירון יש לך אתר ללימוד 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();

פורסם

רשמת את זה איפשהו?


TcpClient client = server.AcceptTcpClient();

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

פורסם
  • מחבר

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

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

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

תודה :)

פורסם

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

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

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

תודה :)

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

ארכיון

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

דיונים חדשים