אינטרנט ישראל
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
ראשי » מדריכים » Node.js » מדריך Node.js: איך עובדים עם sockets

מדריך Node.js: איך עובדים עם sockets

רן בר-זיק נובמבר 25, 2014 7:50 am 2 תגובות

כיצד יוצרים חיבור מסוג socket או מתחברים אל חיבור שמישהו אחר יצר באמצעות Node.js

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

אוהבים את מדריך Node.js? רוצים לדעת עוד?

ספר מקיף על Node.js, בעברית, שנכתב על ידי רן בר-זיק וכולל תרגילים רבים ומידע מקיף - גם על מודולים אסינכרוניים וגם על CLI וסטרימים ומידע רב יותר על Node.js ניתן להורדה ממש פה.
כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

במאמר הקודם דיברנו על streams, במאמר הזה אנו נדבר על Sockets – או יותר נכון האימפלמנטציה של השרת שאמור לתמוך בזה!

אז מה זה Socket? מדובר בצורת תקשורת שאפשר להפעיל אותה בין שני מחשבים (שני שרתים לצורך העניין) כדי להעביר מיעד. sockets משתמשים ב-TCP על מנת להעביר נתונים. בשונה מבקשות HTTP רגילות, עם sockets אנו יכולים ליצור תקשורת שבה שני הצדדים יכולים לשלוח מידע באופן שווה. בניגוד, למשל, ל-HTTP, שם רק ה-client יכול ליצור בקשות.
למשל, אם אני עובד עם AJAX מול שרת מרוחק, הוא יחזיר לי מידע רק אם אני שולח לו בקשה מפורשת דרך AJAX. אם אני עובד עם Socket, אז ברגע שה-client מתחבר, גם השרת וגם ה-client יכולים ליצור בקשות. כל בקשה ב-Socket מגיע כשהיא הרבה יותר רזה מבקשת HTTP – כלומר חוץ מבקשת החיבור הראשונית אין לנו header.
אם יש לנו שני שרתים שצריכים לקיים תקשורת אחד עם השני – socket היא דרך נהדרת לקיום תקשורת כזו. כאשר התקשורת יכולה להעביר כל סוג נתונים שהוא.

כאשר אנו מדברים על Socket ב-Node.js אנחנו יכולים להיות השרת – זה שיושב ומחכה לבקשות. או הלקוח – זה שיוזם את הבקשה. המודול שיוצר הן את השרת והן את הלקוח הוא net.

יצירת שרת מאוד דומה לשרת http. זה נראה משהו כזה:


var net = require('net');
var server = net.createServer(function(socket) { //'connection' listener
    console.log('server connected');
    socket.on('end', function() {
        console.log('server disconnected');
    });
    socket.write('hello\r\n');
    socket.pipe(socket);
});
server.listen(1311, function() { //'listening' listener
    console.log('server bound');
});

את הקוד לעיל, אגב, שיניתי מעט אבל הוא מתבסס על הדוגמה שיש במתודת createServer בדוקומנטציה.

מה הולך פה? מאוד דומה לשרת רגיל – רק שבמקום request אני מעביר אובייקט socket שדרכו מתבצעת התקשורת. במקרה הזה מדובר בשרת משדר בלבד. הוא כותב רק hello.

איך נבדוק את זה? בדיוק בשביל זה יש לנו את פקודת telnet בחלונות ובלינוקס. נקליד את הפקודה הבאה:


telnet 127.0.0.1 1311

ברגע שנתחבר, נוכל לראות 'hello'.

עוד משהו נחמד שאפשר לראות זה שאני משתמש פה ב- pipe ובמקרה הזה ה-socket הוא ה-writable וה-readable אז זה נראה קצת מצחיק. אבל אנחנו משתמשים בו כדי לבצע streaming.

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


var net = require('net');
var server = net.createServer(function(socket) { //'connection' listener
    console.log('server connected');
    socket.on('end', function() {
        console.log('server disconnected');
    });

    socket.on('data', function(data) {
        console.log('data received:'+data);
        socket.write('data is:'+data);
        socket.pipe(socket);
    });


});
server.listen(1311, function() { //'listening' listener
    console.log('server bound');
});

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



var client = new net.Socket();
client.connect(1311, '127.0.0.1', function() {
    console.log('Connected');

    client.write('Hello, server! Love, Client.');
    client.pipe(client);
});

client.on('data', function(data) {
    console.log('Received: ' + data);
    client.destroy(); // kill client after server's response
});

client.on('close', function() {
    console.log('Connection closed');
});

הדוגמה, אגב, נקלחה במלואה עם שינוי קל (פשוט הוספתי את ה-pipe) מה-Gist הזה.

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

שימו לב שכאשר אנו מדברים על Sockets במאמר הזה – אנחנו לא מדברים על Web Sockets שהוא אימפלמנטציה של Sockets בסביבת דפדפן. למי שלא מכיר את Web Sockets – אני ממליץ בחום רב לקרוא את המאמר על Web Sockets שכתבתי ומסביר איך זה עובד מבחינת הפרונט אנד. למי שכן מכיר: זה לא Web Sockets, אם אנחנו רוצים לממש Web Sockets אז צריך להשתמש בשרת http כדי לממש את הפרוטוקול של ה-Hand Shake של Web Sockets או (מה שכולם עושים) להשתמש במודול חיצוני כדי לעשות את זה.

במאמר הבא אנו נדבר על npm.

⚠️ תזכורת – המדריכים האלו הם רק טעימה, בספר שלי "ללמוד Node.js בעברית" יש הסברים מלאים ומקיפים על השפה המיועדים ללימוד עצמי. עם תרגילים והסברים. הספר יצא לאור בשיתוף הקריה האקדמית אונו ובתמיכת החברות אלמנטור, ו-Iron source ונערך טכנית על ידי בנג'י גרינבאום (מפתח ליבה של Node.js), גיל פינק ומתכנתים מעולים נוספים. 

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.
כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

אוהבים את מדריך Node.js? רוצים לדעת עוד?

ספר מקיף על Node.js, בעברית, שנכתב על ידי רן בר-זיק וכולל תרגילים רבים ומידע מקיף - גם על מודולים אסינכרוניים וגם על CLI וסטרימים ומידע רב יותר על Node.js ניתן להורדה ממש פה.
למאמר הקודם בסדרת המדריכים על Node.jsמדריך Node.js: שימוש ב-Streams
למאמר הבא בסדרת המדריכים על Node.jsמדריך Node.js: התקנת מודולים חיצוניים
לכל המאמרים במדריך
node.js

2 תגובות

  1. Yaniv הגב דצמבר 7, 2016 בשעה 5:20 pm

    מה היה קורה אלאמלא היית מוסיף את הpipe לדוגמא מהגיסט?
    מה קורה במילים אחרות אם עושים write ללא pipe אחריו?

  2. רן כהן הגב דצמבר 23, 2016 בשעה 7:39 pm

    למה צריך את ;(client.pipe(client? אם אני מוריד אותו הכל מודפס יופי, אבל אם אני משאיר אותו הוא גורם לשגיאה (בהרצה מ WebStorm):
    events.js:160
    throw er; // Unhandled 'error' event
    ^

    Error: This socket is closed
    at Socket._writeGeneric (net.js:680:19)
    at Socket._write (net.js:731:8)
    at doWrite (_stream_writable.js:334:12)
    at writeOrBuffer (_stream_writable.js:320:5)
    at Socket.Writable.write (_stream_writable.js:247:11)
    at Socket.write (net.js:658:40)
    at Socket.ondata (_stream_readable.js:555:20)
    at emitOne (events.js:101:20)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)

השארת תגובה

ביטול

ללמוד ג'אווהסקריפט בעברית

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

רשימת הנושאים
  • מדריכים
    • ריאקט
    • טייפסקריפט
    • ECMAScript 6
    • ES20XX
    • Node.js
    • Express
    • רספברי פיי
    • Babel
    • docker
    • MongoDB
    • Git
    • לימוד MySQL
    • SASS
    • jQuery
    • CSS3
    • HTML 5
    • SVN
    • LESS
  • פיתוח אינטרנט
    • פתרונות ומאמרים על פיתוח אינטרנט
    • jQuery Scripts
    • jQuery למתקדמים
    • יסודות בתכנות
    • נגישות אינטרנט
  • חדשות אינטרנט
  • מידע כללי על אינטרנט
    • רשת האינטרנט
    • בניית אתרי אינטרנט
  • rss logo

    לכל המאמרים

    לכל המאמרים שפורסמו באינטרנט ישראל משנת 2008 ועד עכשיו.
  • rss logo

    RSS Feed

    משתמשים בקורא RSS? אם כן, עקבו אחרי אינטרנט ישראל באמצעות פיד ה-RSS!
    מה זה RSS?
  • Twitter logo

    עקבו אחרי בטוויטר

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

    ערוץ הטלגרם של אינטרנט ישראל

    בערוץ הטלגרם של אינטרנט ישראל אני מפרסם את הפוסטים של באתר וכן עדכונים טכנולוגיים נוספים.
    מה זה טלגרם?
  • github logo

    הפרויקטים שלי בגיטהאב

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

כל הזכויות שמורות לרן בר-זיק ולאינטרנט ישראל | מדיניות הפרטיות של אתר אינטרנט ישראל | אתר אינטרנט ישראל נגיש לפי תקן WCAG 2.0 AA | הצהרת הנגישות של האתר | אבטחת מידע ודיווח על בעיית אבטחת מידע

גלילה לראש העמוד