HWzoneHWzoneHWzone
  • ראשי
  • כתבות פופולריות
  • הגדרת התראות
  • מחשבים
    מחשבים
    הצג עוד
    כתבות מובילות
    משטח משלוח של כרטיסי מסך יוקרתיים במחסן מטענים בנמל תעופה, עם אריזות חסרות וניילון עטיפה קרוע
    חצי מיליון דולר נעלמו בשדה התעופה: שני משטחים של RTX 5090 אבדו
    20/10/2026
    הדרך להפסיק לשלם ולקחת בעלות: בנינו שרת AI מפלצתי מקומי
    22/08/2026
    מעבד שרתים גדול מועבר למגש בדיקה במפעל שבבים, כשמעבדי מחשבים ניידים ממתינים ברקע
    אינטל מעדיפה שרתים על מחשבים אישיים ומשנה את תוכניות הייצור
    02/11/2026
    כתבות אחרונות
    מבצעי נובמבר 2026: שבעה מסכי מחשב שבאמת ירדו במחיר
    12/11/2026
    אחרי 31 שנה: Windows 11 תאפשר להשתיק את חלונית Sticky Keys
    10/11/2026
    20 שנה ל-GeForce 8800 GTX: הדמו דורש לפחות RTX 4070
    10/11/2026
    AMD מאשרת באג ב-Radeon: הדרייבר כותב ל-SSD גם במנוחה
    09/11/2026
  • גאדגטים
    גאדגטים
    הצג עוד
    כתבות מובילות
    ניסיתי סמארטפון מתקפל בפעם הראשונה - התרשמויות משימוש Galaxy Z Fold8
    27/09/2026
    שחזור דיגיטלי של ה-iPod המקורי משנת 2001 מופיע בתוך דף אינטרנט במחשב נייד
    אפל מחזירה את ה-iPod המקורי לחיים, ומחביאה אותו באתר שלה
    25/10/2026
    הדמיה של מערכת הבית החכם החדשה של אפל עם מסך HomePad, רמקול HomePod mini ומזרים Apple TV 4K
    אפל חוזרת לסלון: שלושה מוצרים חדשים בדרך, כולל מסך חכם שיתחרה באמזון ובגוגל
    10/10/2026
    כתבות אחרונות
    אחרי שש שנות עיכוב: אמזון משיקה רחפן אבטחה ביתי ב-250 דולר
    11/11/2026
    סמארטפון חדש עם RAM משומש: עד 9% מהמכשירים ב-2027
    10/11/2026
    אינסטגרם רוצה להחליף את תוכנת העריכה שלכם, והיא מתחילה במק
    07/11/2026
    אחרי עשור: Bluetooth מעלה את המהירות המרבית כמעט פי ארבעה
    06/11/2026
  • גיימינג
    גיימינג
    הצג עוד
    כתבות מובילות
    קונסולת PlayStation 5 לצד מסך המציג משחקי PC בתוך ממשק הקונסולה באמצעות Playden
    בלי מחשב ובלי סטרימינג: משחקי PC רצים ישירות על PlayStation 5
    27/10/2026
    המחשה של לוח אם בקונסולת משחקים עתידית עם שבבי זיכרון ואחסון חשופים
    ה-PlayStation 6 עשויה לעלות יותר מ-1,000 דולר
    20/10/2026
    קונסולת Xbox One ותיקה מחוברת לטלוויזיה המציגה משחק מודרני בעולם פתוח באמצעות הזרמה מהענן
    קונסולה מ-2013 תריץ את GTA 6, אבל מחשב גיימינג לא
    11/11/2026
    כתבות אחרונות
    קונסולה מ-2013 תריץ את GTA 6, אבל מחשב גיימינג לא
    11/11/2026
    GTA 6 מוכן להורדה, אבל שחקני הקונסולות יסתפקו ב-30 FPS
    11/11/2026
    שבועיים להשקה: 39 תמונות חדשות מציגות את העולם של GTA 6
    06/11/2026
    סיכום השבוע: אינטל, Claude ועוד
    06/11/2026
  • טכנולוגיה
    טכנולוגיה
    הצג עוד
    כתבות מובילות
    משאית הובלה מסחרית רגילה ועליה משטחים של חומרת מחשוב יקרה, להמחשת גניבת משלוח NVIDIA בשווי 11.4 מיליון דולר
    משאית אספה חומרה של NVIDIA ב-11.4 מיליון דולר ונעלמה
    07/11/2026
    מחשב נייד המריץ מערכת הפעלה ניסיונית שפותחה באמצעות סוכני בינה מלאכותית של Claude Fable 5.2
    אלף סוכני Claude בנו מערכת הפעלה בשמונה ימים
    10/11/2026
    Google's Gemini 4 Carbon Tops Every Other Model In All But Two Of Google's Benchmarks, Scoring 88.2 Percent On SEC-bench Pro Vulnerability Discovery
    גוגל מציגה את Gemini 4 Carbon: ראשון בדירוג, סגור לציבור
    29/10/2026
    כתבות אחרונות
    רומן וחשד לריגול: NVIDIA נתבעת אחרי אובדן 190 מיליארד דולר
    11/11/2026
    10,000 ארונות NVIDIA בחלל עד 2028: התחזית החדשה ל-SpaceX
    11/11/2026
    אלף סוכני Claude בנו מערכת הפעלה בשמונה ימים
    10/11/2026
    מנכ"ל אפל לא מסתפק בסירי החדשה: דורש סוכן AI עצמאי
    10/11/2026
  • ביקורות
    ביקורות
    הצג עוד
    כתבות מובילות
    הדרך להפסיק לשלם ולקחת בעלות: בנינו שרת AI מפלצתי מקומי
    22/08/2026
    ניסיתי סמארטפון מתקפל בפעם הראשונה - התרשמויות משימוש Galaxy Z Fold8
    27/09/2026
    מחשב ASUS Ascent GX10 מבוסס NVIDIA DGX Spark בסקירה: דמוקרטיזציה של מודלים מקומיים
    04/10/2026
    כתבות אחרונות
    ככה הגדרתי סביבת עבודה עבור שרת AI מפלצתי מקומי מבוסס Intel ARC
    03/11/2026
    מחשב ASUS Ascent GX10 מבוסס NVIDIA DGX Spark בסקירה: דמוקרטיזציה של מודלים מקומיים
    04/10/2026
    ניסיתי סמארטפון מתקפל בפעם הראשונה - התרשמויות משימוש Galaxy Z Fold8
    27/09/2026
    GIGABYTE GAMING A16 עם RTX 5060 - מה תקבלו בקטגוריה הזולה של מחשבי גיימינג ניידים?
    12/09/2026
  • ספיישלים
    • CES
      • CES 2026
      • CES 2025
      • CES 2024
      • CES 2023
      • CES 2022
      • CES 2020
      • CES 2019
      • CES 2018
      • CES 2017
      • CES 2016
      • CES 2015
      • CES 2013
      • CES 2012
      • CES 2011
      • CES 2009
    • Computex
      • Computex 2019
      • Computex 2018
      • Computex 2016
      • Computex 2014
      • Computex 2013
      • Computex 2012
      • Computex 2011
      • Computex 2010
      • Computex 2009
      • Computex 2008
      • Computex 2007
    • E3 2016
    • עשור לאתר המחשבים
    • CeBIT 2008
    • CeBIT 2007
  • פורומים
  • זכרונות
  • הפיד שלי
  • ניהול העדפות
  • ערוצים פרסומיים
עקבו אחרינו ברשתות
  • אודות האתר
  • צרו קשר
  • פרסם אצלנו
  • תנאי שימוש ומדיניות פרטיות
  • הצהרת נגישות
בקריאה עכשיו: מדריך תקשורת באמצעות Net.
HWzoneHWzone
  • ראשי
  • כתבות פופולריות
  • הגדרת התראות
  • מחשבים
  • גאדגטים
  • גיימינג
  • טכנולוגיה
  • ביקורות
  • ספיישלים
    • CES
    • Computex
    • E3 2016
    • עשור לאתר המחשבים
    • CeBIT 2008
    • CeBIT 2007
  • פורומים
  • זכרונות
עקבו אחרינו
  • אודות האתר
  • צרו קשר
  • פרסם אצלנו
  • תנאי שימוש ומדיניות פרטיות
  • הצהרת נגישות
טכנולוגיהמדריכים

מדריך תקשורת באמצעות Net.

עדכון אחרון: 03/08/2014 בשעה 03:17
03/10/2011
45 דקות קריאה
שיתוף
רוצים לראות יותר מ-HWzone בתוצאות של Google?הוסיפו אותנו כמקור מועדף ב-Google
עקבו אחרינו ב-Googleהוסיפו את HWzone כמקור מועדף
צד השרת
 
תוכנת השרת שבה נעשה שימוש במדריך זה מאזינה ללקוח בפורט 2021. ברגע שלקוח התחבר היא מתחילה להאזין להודעות שלו, וברגע שהוא מתנתק היא חוזרת להתחלה ומאזינה ללקוח הבא שיתחבר אחריו. כרגע הצ'אט שלנו תומך רק בלקוח אחד מחובר.
 
תצלום השרת
 
אנו לא נקרא את צד השרת והלקוח על כלל שורותיו, אלא נעבור על החלקים החשובים בלבד. צד השרת מכיל את המשתנים הבאים:
 

TcpListener tcpListener; //Allows us to open a socket to listen any incoming message
bool listening = false; //True if the server is currently listening
 
TcpClient tcpClient; //The TCP client that will connect
 

tcpListener - המשתנה החשוב ביותר: באמצעותו אנו יכלים להאזין ללקוחות אשר יתחברו. הוא מאפשר לנו לפתוח את הסוקט ולהאזין.
 
listening - משתנה בוליאני. ערכו אמת אם אנו כרגע מאזינים ללקוחות.
 
tcpClient - כאשר משתמש מתחבר אובייקט ה-tcpListener מחזיר לנו אובייקט TcpClient אשר מאפשר לנו להתייחס ללקוח שהתחבר. באמצעות אובייקט זה אנו יכלים להאזין להודעות שהלקוח שולח וגם לשלוח לו הודעות בחזרה.
 
ראשית נעבור על חלק הקוד הבא:
 

עקבו אחרינו ב-Googleהוסיפו את HWzone כמקור מועדף

 
 
 
 
 
 
/* Because we are using Multi-threading we need to be
* able to update the output textbox (chat area). We are using
* the InvokeRequired method - this prevents the cross thread access exception.
*/
private delegate void AddToOutput_Delegate(string str);
private void AddToOutput(string str)
{
if (InvokeRequired)
{
Invoke(new AddToOutput_Delegate(AddToOutput), str);
return;
}
 
if (!this.IsDisposed) //If our form still accessable (not closed)
Output_TextBox.AppendText(DateTime.Now.ToString() + ": " + str + "n");
}

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

Invoke(new AddToOutput_Delegate(AddToOutput), str);
return;

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

/* Starts listening on a specific socket.
* Multi-threading is used to keep the UI responsive.
*/
private void MainForm_Load(object sender, EventArgs e)
{
AddToOutput("Server loaded.");
tcpListener = new TcpListener(2021);
tcpListener.Start();
 
listening = true; //We are starting to listen
new Thread(new ThreadStart(Listen_Thread)).Start(); //Starts listening on a seperate thread
AddToOutput("Started listening…");
}

 
ראשית אנו יוצרים אובייקט TcpListener שמאזין בפורט 2021 ומתחילים את ההאזנה. המשתנה listening הופך לאמת (השרת התחיל להאזין) והליך חדש נפתח להאזנה.
 

new Thread(new ThreadStart(Listen_Thread)).Start(); //Starts listening on a seperate thread

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

/* This is where all of the background work is done, allows the UI stay
* responsive and not get stuck in a specific line or a loop.
* With network enabled application multi-threading is the basic and most
* important part of the application.
*/
private void Listen_Thread()
{
while (listening)
{
try
{
                    tcpClient = tcpListener.AcceptTcpClient();
 
                    AddToOutput("Client connected");
                    try //Listen to the connected client, if an error occurs, stop listening
                    {
                        while (tcpClient.Connected)
                        {
                            NetworkStream netStream = tcpClient.GetStream();
 
                            byte[] receivedBytes = new byte[tcpClient.ReceiveBufferSize];
 
                            if (netStream.Read(receivedBytes, 0, receivedBytes.Length) != 0)
                            {
                                //Starts analyzing the data received
 
                                for (int i = 0; i <= receivedBytes.Length; i++)
                                {
                                    if (i + ChatMessage.MinimumBytes >= receivedBytes.Length) //Message is not long enough to be read
                                        break;
 
                                    ChatMessage cMessage = ChatMessage.FromBytes(receivedBytes, i); //Converts the byte array into a ChatMessage object again
 
                                    if (cMessage.IsMessageValid)
                                    {
                                        AddToOutput(cMessage.NickName + ": " + cMessage.Message); //Updates the UI with the message received
 
                                        //Increase the offset, skip the message bytes we just analyzed
                                        i += cMessage.BytesCount - 1;
                                    }
 
                                }
 
                            }
                            else //Client got disconnected
                                break;
 
                        }
                    }
                    catch (Exception ex)
                    {
                    }
 
                    tcpClient.Close();
                    tcpClient = null; //Empties the tcpClient object - we no longer need it
                    AddToOutput("Client disconnected"); //Client go disconnected, listen to other client
                }
                catch (Exception ex)
                {
                    //An error had occured, probably TcpListener stopped listening using the Stop() method
                    listening = false;
                }
 
}
}

 
הליך זה הוא ההליך החשוב ביותר בצד השרת. נתאר את מה שההליך מבצע בנקודות:
  1. נאזין ללקוח שיתחבר, ההליך שלנו יתקע בשורה הבאה עד שהלקוח יתחבר:
  2. tcpClient = tcpListener.AcceptTcpClient();

     
    ברגע שלקוח יתחבר נעדכן את הממשק ("Client Connected") וכך ניידע את המשתמש שלקוח יתחבר. ערכו של tcpClient יהיה הלקוח המרוחק שיתחבר.
     
  3. לאחר שהלקוח התחבר ניצור לולאה שתאזין ללקוח עד שהקשר יתנתק:
  4. while (tcpClient.Connected) { …

     
    בתוך לולאה זו נגיד להליך לבדוק אם הגיעה הודעה חדשה. ניצור מערך של בייטים אשר יכיל את המידע שה-tcpClient שלנו רוצה לשלוח (או בצורה יותר ברורה: המידע שהשרת צריך לקבל מהלקוח). נשתמש בפונקציה netStream.Read בכדי לקרוא את המידע שהתקבל מן הלקוח. פונקציה זו תחזיר לנו את מספר הבייטים שהתקבלו מן הלקוח, ואם מספר זה שווה ל-0 אנו יודעים שהלקוח התנתק, לכן נצא מתוך הלולאה ונעבור לשלב 4. אם המידע שהתקבל גדול מ-0 נעבור לשלב שלוש.
     
  5. בשלב זה ננתח את כל המידע שהתקבל מן הלקוח. באמצעות לולאת For נעבור על כך מערך הבייטים של ההודעה שהתקבלה:
  6.  

    for (int i = 0; i <= receivedBytes.Length; i++)
    {
    if (i + ChatMessage.MinimumBytes >= receivedBytes.Length) //Message is not long enough to be read
    break;
     
    ChatMessage cMessage = ChatMessage.FromBytes(receivedBytes, i); //Converts the byte array into a ChatMessage object again
     
    if (cMessage.IsMessageValid)
    {
    AddToOutput(cMessage.NickName + ": " + cMessage.Message); //Updates the UI with the message received
     
    //Increase the offset, skip the message bytes we just analyzed
    i += cMessage.BytesCount - 1;
    }
     
    }

     
    נשתמש בפונקציות שיצרנו במחלקת ה-ChatMessage בכדי לפענח את המידע שהתקבל. ראשית נבדוק אם המערך שלנו מכיל מספיק בייטים מהאינדקס (i) שציינו, כך שלא נצא מתוך תחום המערך ותתקיים שגיאה. כמות הבייטים המינימלית שווה ל-MinimumBytes (קבוע שארכו הוא 8), כך שההודעה חייבת להכיל את המספר המינימלי הזה. לאחר שהבדיקה עברה בהצלחה ויש לנו מספיק בייטים לנתח, נשלוף את אובייקט ה-ChatMessage מתוך מערך הבייטים באמצעות האינדקס הנוכחי שלנו והפונקציה ChatMessage.FromBytes. לאחר מכן נבדוק אם ההודעה תקפה באמצעות הפונקציה IsMessageValid, במידה וכן קיבלנו הודעה תקפה (שמכילה תוכן) נוסיף את ההודעה לממשק המשתמש (לתיבת הצ'אט) וכך נעדכן את המשתמש. כעת נפסח על כל הבייטים שכרגע ניתחנו על ידי העלאת משתנה האינדקס (i) במספר הבייטים שכבר ניתחנו.
     
  7. ברגע שהמשתמש התנתק (כשבשלב 2 קיבלנו 0 בייטים מהפונקציה netStream.Read) נסגור את השיחה שלנו באמצעות המתודה tcpClient.Close ונרוקן את האובייקט tcpClient. נעדכן את ממשק המשתמש בהודעה "Client Disconnected" ונחזור לשלב 1 כל עוד אנחנו מאזינים.
 
עד כה דיברנו רק על קבלת מידע מהלקוח. אם כן, כיצד אנו שולחים מידע? פשוט מאוד:
 

private void Send_Button_Click(object sender, EventArgs e)
{
ChatMessage cMessage = new ChatMessage("Server", Input_TextBox.Text);
if (tcpClient != null)
tcpClient.GetStream().Write(cMessage.GetBytes(), 0, cMessage.BytesCount); //Turns the ChatMessage object into a byte array and sends it out to the remote client
 
AddToOutput(cMessage.NickName + ": " + cMessage.Message); //Updating the UI
 
//Disable the send button and clear the textbox
Input_TextBox.Clear();
Send_Button.Enabled = false;
}

  1. יוצרים אובייקט ChatMessage חדש אשר מכיל את הכינוי של השולח (במקרה שלנו השם הוא Server"") ואת תוכן ההודעה (אשר אנו לוקחים מתוך תיבת הטקסט).
  2. אם הלקוח מחובר (ערכו של האובייקט אינו null), נשיג את ה-NetworkStream שלו ונכתוב אליו את מערך הבייטים של אובייקט ה-ChatMessage. נעשה זאת באמצעות המתודה tcpClient.GetStream().Write. הפרמטר הראשון יהיה מערך הבייטים שנרצה לשלוח, המיקום שבו ההודעה מתחילה (תמיד יהיה שווה ל-0) וכמות הבייטים שנשלח.
  3. נעדכן את תיבת הצ'אט עם ההודעה שנשלחה.
כאשר אנו סוגרים את התוכנה עלינו גם לסגור את החיבור לשרת וכל תקשורת אחרת שפנויה. אנו נעשה זאת באופן הבא:
 

/* Stops listening for any clients and closes the form
* Always close any open sockets when application is about to close.
*/
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
listening = false; //Allows the listen thread end
if (tcpClient != null) tcpClient.Close(); //Closes the client socket
tcpListener.Stop(); //Closes the socket, stops listening
}

 
כעת סגרנו כל תקשורת קיימת והתוכנה תסגר.

העמוד הקודם123456העמוד הבא

הצטרפו לערוץ הטלגרם שלנו!

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

הצטרפו עכשיו

היום לפני 5-22 שנים ב-HWzone: Nintendo Switch, Office בחינם ועוד
Claude מתחבר לבנק ומוצא חיובים שאפילו אתם פספסתם
סם אלטמן: ה-RAM במחשב שלכם מבזבז זכרון שיכל להיות בחוות שרתים
נטפליקס הופכת את PUBG לסדרה, ודונלד גלובר מקבל ארבעה תפקידים
אמזון מציגה את התשובה שלה לגוגל ולאפל עם חמישה מכשירים חדשים
תגיות:YouTubeאינטרנטמיקרוסופט
איך זה גורם לך להרגיש?
אהבתי!0
מצחיק!0
עצוב0
מופתע0
משועמם0
כועס0
טוען תגובות...

כתבות פופולריות

משאית הובלה מסחרית רגילה ועליה משטחים של חומרת מחשוב יקרה, להמחשת גניבת משלוח NVIDIA בשווי 11.4 מיליון דולר
משאית אספה חומרה של NVIDIA ב-11.4 מיליון דולר ונעלמה
07/11/2026
מחשב נייד המריץ מערכת הפעלה ניסיונית שפותחה באמצעות סוכני בינה מלאכותית של Claude Fable 5.2
אלף סוכני Claude בנו מערכת הפעלה בשמונה ימים
10/11/2026
משטח משלוח של כרטיסי מסך יוקרתיים במחסן מטענים בנמל תעופה, עם אריזות חסרות וניילון עטיפה קרוע
חצי מיליון דולר נעלמו בשדה התעופה: שני משטחים של RTX 5090 אבדו
20/10/2026
הדרך להפסיק לשלם ולקחת בעלות: בנינו שרת AI מפלצתי מקומי
22/08/2026
HWzoneHWzone
עקבו אחרינו
  • אודות האתר
  • צרו קשר
  • פרסם אצלנו
  • תנאי שימוש ומדיניות פרטיות
  • הצהרת נגישות