Node.jsNode.js入門

備註

Node.js是一個基於事件的非阻塞異步I / O框架,它使用Google的V8 JavaScript引擎。它用於開發大量使用在客戶端和服務器端運行JavaScript的應用程序的應用程序,因此可以從代碼的可重用性和缺少上下文切換中受益。它是開源和跨平台的。 Node.js應用程序是用純JavaScript編寫的,可以在Windows,Linux等的Node.js環境中運行......

版本

發布日期
v8.2.1 二零一七年七月二十零日
V8.2.0 2017年7月19日
V8.1.4 2017年7月11日
v8.1.3 2017年6月29日
V8.1.2 2017年6月15日
v8.1.1 2017年6月13日
V8.1.0 2017年6月8日
V8.0.0 2017年5月30日
V7.10.0 2017年5月2日
V7.9.0 2017年4月11日
v7.8.0 2017年3月29日
v7.7.4 2017年3月21日
v7.7.3 2017年3月14日
v7.7.2 2017年3月8日
v7.7.1 2017年3月2日
v7.7.0 2017年2月28日
v7.6.0 2017年2月21日
V7.5.0 2017年1月31日
V7.4.0 2017年1月4日
V7.3.0 2016年12月20日
v7.2.1 2016年12月6日
V7.2.0 2016年11月22日
V7.1.0 2016年11月8日
7.0.0 2016年10月25日
v6.11.0 2017年6月6日
v6.10.3 2017年5月2日
v6.10.2 2017年4月4日
v6.10.1 2017年3月21日
v6.10.0 2017年2月21日
v6.9.5 2017年1月31日
v6.9.4 2017年1月5日
v6.9.3 2017年1月5日
v6.9.2 2016年12月6日
v6.9.1 2016年10月19日
v6.9.0 2016年10月18日
v6.8.1 二〇一六年十月十四日
v6.8.0添二零一六年十月一十二日
v6.7.0 2016年9月27日
V6.6.0 2016年9月14日
V6.5.0 2016年8月26日
V6.4.0 2016年8月12日
v6.3.1 2016年7月21日
v6.3.0 2016年7月6日
V6.2.2 2016年6月16日
V6.2.1 2016年6月2日
V6.2.0 2016年5月17日
V6.1.0 2016年5月5日
V6.0.0 2016年4月26日
v5.12.0 2016年6月23日
v5.11.1 2016年5月5日
v5.11.0 2016年4月21日
v5.10.1 2016年4月5日
V5.10 2016年4月1日
V5.9 2016年3月16日
V5.8 2016年3月9日
V5.7 2016年2月23日
V5.6 2016年2月9日
V5.5 2016年1月21日
V5.4 2016年1月6日
V5.3 2015年12月15日
V5.2 2015年12月9日
V5.1 二〇一五年十一月十七日
V5.0 2015年10月29日
V4.4 2016年3月8日
V4.3 2016年2月9日
V4.2 2015年10月12日
V4.1 2015年9月17日
V4.0 2015-09-08
io.js v3.3 2015年9月2日
io.js v3.2 2015年8月25日
io.js v3.1 2015年8月19日
io.js v3.0 2015年8月4日
io.js v2.5 2015年7月28日
io.js v2.4 2015年7月17日
io.js v2.3 2015年6月13日
io.js v2.2 2015年6月1日
io.js v2.1 2015年5月24日
io.js v2.0 2015年5月4日
io.js v1.8 2015年4月21日
io.js v1.7 2015年4月17日
io.js v1.6 2015年3月20日
io.js v1.5 2015年3月6日
io.js v1.4 2015年2月27日
io.js v1.3 二零一五年二月二十零日
io.js v1.2 2015年2月11日
io.js v1.1 2015年2月3日
io.js v1.0 2015年1月14日
v0.12 2016年2月9日
v0.11 2013年3月28日
v0.10 2013年3月11日
V0.9 2012-07-20
V0.8 2012-06-22
V0.7 2012-01-17
V0.6 2011-11-04
V0.5 2011-08-26
V0.4 2011-08-26
V0.3 2011-08-26
V0.2 2011-08-26
V0.1 2011-08-26

Hello World HTTP服務器

首先,為您的平台安裝Node.js.

在這個例子中,我們將創建一個偵聽端口1337的HTTP服務器,它發送Hello, World! 到瀏覽器。請注意,您可以使用當前未被任何其他服務使用的任何您選擇的端口號,而不是使用端口1337。

http 模塊是Node.js 核心模塊 (Node.js源中包含的模塊,不需要安裝其他資源)。 http 模塊提供使用http.createServer() 方法創建HTTP服務器的功能。要創建應用程序,請創建包含以下JavaScript代碼的文件。

const http = require('http'); // Loads the http module

http.createServer((request, response) => {

    // 1. Tell the browser everything is OK (Status code 200), and the data is in plain text
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    // 2. Write the announced text to the body of the page
    response.write('Hello, World!\n');

    // 3. Tell the server that all of the response headers and body have been sent
    response.end();

}).listen(1337); // 4. Tells the server what port to be on
 

使用任何文件名保存文件。在這種情況下,如果我們將其命名為hello.js 我們可以通過轉到文件所在的目錄並使用以下命令來運行應用程序:

node hello.js
 

然後可以使用URL http:// localhost:1337http://127.0.0.1:1337在瀏覽器中訪問創建的服務器。

將出現一個簡單的網頁,頂部顯示“Hello,World!”文本,如下面的屏幕截圖所示。

截圖

可編輯的在線示例。

核心模塊

Node.js是一個Javascript引擎(用於Chrome的谷歌V8引擎,用C ++編寫),允許在瀏覽器外運行Javascript。雖然有許多庫可用於擴展Node的功能,但該引擎附帶了一組實現基本功能的核心模塊

Node目前包含34個核心模塊:

[ 'assert',
  'buffer',
  'c/c++_addons',
  'child_process',
  'cluster',
  'console',
  'crypto',
  'deprecated_apis',
  'dns',
  'domain',
  'Events',
  'fs',
  'http',
  'https',
  'module',
  'net',
  'os',
  'path',
  'punycode',
  'querystring',
  'readline',
  'repl',
  'stream',
  'string_decoder',
  'timers',
  'tls_(ssl)',
  'tracing',
  'tty',
  'dgram',
  'url',
  'util',
  'v8',
  'vm',
  'zlib' ]
 

此列表是從Node文檔API https://nodejs.org/api/all.html(JSON文件: https//nodejs.org/api/all.json )獲得的。

所有核心模塊一目了然

斷言

assert 模塊提供了一組簡單的斷言測試,可用於測試不變量。

緩衝

在ECMAScript 2015(ES6)中引入TypedArray 之前,JavaScript語言沒有讀取或操作二進制數據流的機制。 Buffer 類是作為Node.js API的一部分引入的,可以在TCP流和文件系統操作等環境中與八位字節流進行交互。

現在已經在ES6中添加了TypedArray Buffer 類以更優化且適合Node.js用例的方式實現Uin t8Array API。

C / C ++ _插件

Node.js Addons是動態鏈接的共享對象,用C或C ++編寫,可以使用require() 函數加載到Node.js中,就像它們是普通的Node.js模塊一樣使用。它們主要用於提供Node.js中運行的JavaScript與C / C ++庫之間的接口。

child_process

child_process 模塊提供了以與popen(3)類似但不相同的方式生成子進程的能力。

Node.js的單個實例在單個線程中運行。為了利用多核系統,用戶有時會想要啟動一個Node.js進程集群來處理負載。群集模塊允許您輕鬆創建所有共享服務器端口的子進程。

安慰

console 模塊提供了一個簡單的調試控制台,類似於Web瀏覽器提供的JavaScript控制台機制。

加密

crypto 模塊提供加密功能,其中包括一組用於OpenSSL哈希,HMAC,密碼,解密,簽名和驗證功能的包裝器。

deprecated_apis

當以下情況之一時,Node.js可以棄用API:(a)API的使用被認為是不安全的,(b)已經提供了改進的替代API,或者(c)在未來的主要版本中預計會對API進行重大更改。

DNS

dns 模塊包含屬於兩個不同類別的函數:

  1. 使用基礎操作系統工具執行名稱解析但不一定執行任何網絡通信的函數。此類別僅包含一個函數: dns.lookup()
  2. 連接到實際DNS服務器以執行名稱解析並始終使用網絡執行DNS查詢的函數。此類別包含dns 模塊中 dns.lookup() 之外的所有函數。

此模塊正在等待棄用 。替換API完成後,將完全棄用此模塊。大多數最終用戶應該有理由使用這個模塊。絕對必須具有域提供的功能的用戶可能暫時依賴它,但是應該期望將來必須遷移到不同的解決方案。

活動

Node.js核心API的大部分是圍繞一個慣用的異步事件驅動架構構建的,其中某些類型的對象(稱為“發射器”)週期性地發出命名事件,導致調用Function對象(“偵聽器”)。

FS

文件I / O由標準POSIX函數的簡單包裝提供。要使用此模塊,請執行require('fs') 。所有方法都有異步和同步形式。

HTTP

Node.js中的HTTP接口旨在支持傳統上難以使用的協議的許多功能。特別是,大的,可能是塊編碼的消息。界面小心永遠不會緩衝整個請求或響應 - 用戶能夠流式傳輸數據。

HTTPS

HTTPS是TLS / SSL上的HTTP協議。在Node.js中,這是作為一個單獨的模塊實現的。

Node.js有一個簡單的模塊加載系統。在Node.js中,文件和模塊是一一對應的(每個文件都被視為一個單獨的模塊)。

net 模塊為您提供異步網絡包裝器。它包含用於創建服務器和客戶端(稱為流)的功能。你可以用require('net'); 包含這個模塊require('net');

os 模塊提供了許多與操作系統相關的實用方法。

路徑

path 模塊提供用於處理文件和目錄路徑的實用程序。

Punycode碼

不推薦使用Node.js中捆綁的punycode模塊的版本

請求參數

querystring 模塊提供用於解析和格式化URL查詢字符串的實用程序。

的ReadLine

readline 模塊提供了一個接口,用於一次一行地從可讀流(例如process.stdin )讀取數據。

REPL

repl 模塊提供Read-Eval-Print-Loop(REPL)實現,既可以作為獨立程序使用,也可以在其他應用程序中使用。

流是一個抽象接口,用於處理Node.js中的流數據。 stream 模塊提供了一個基本API,可以輕鬆構建實現流接口的對象。

Node.js提供了許多流對象。例如,對HTTP服務器和process.stdout 的請求都是流實例。

string_decoder

string_decoder 模塊提供了一個API,用於以保留編碼的多字節UTF-8和UTF-16字符的方式將Buffer 對象解碼為字符串。

計時器

timer 模塊公開了一個全局API,用於調度將在某個未來時間段調用的函數。因為計時器函數是全局變量,所以不需要調用require('timers') 來使用API​​。

Node.js中的計時器函數實現與Web瀏覽器提供的計時器API類似的API,但使用圍繞Node.js事件循環構建的不同內部實現。

tls_(SSL)

tls 模塊提供了基於OpenSSL構建的傳輸層安全性(TLS)和安全套接字層(SSL)協議的實現。

追踪

跟踪事件提供了一種機制來集中由V8,節點核心和用戶空間代碼生成的跟踪信息。

可以通過在啟動Node.js應用程序時傳遞--trace-events-enabled 標誌來啟用跟踪。

TTY

tty 模塊提供tty.ReadStreamtty.WriteStream 類。在大多數情況下,沒有必要或不可能直接使用該模塊。

DGRAM

dgram 模塊提供UDP數據報套接字的實現。

網址

url 模塊提供用於URL解析和解析的實用程序。

UTIL

util 模塊主要用於支持Node.js自己的內部API的需求。但是,許多實用程序對應用程序和模塊開發人員也很有用。

V8

v8 模塊公開了特定於Node.js二進製文件中內置的V8版本的API。

注意 :API和實現可能隨時更改。

VM

vm 模塊提供用於在V8虛擬機上下文中編譯和運行代碼的API。 JavaScript代碼可以立即編譯和運行,也可以編譯,保存並稍後運行。

注意 :vm模塊不是安全機制。 不要使用它來運行不受信任的代碼

zlib的

zlib 模塊提供使用Gzip和Deflate / Inflate實現的壓縮功能。

調試NodeJS應用程序

您可以使用節點檢查器。運行此命令以通過npm安裝它:

npm install -g node-inspector
 

然後,您可以使用調試應用程序

node-debug app.js
 

可以在此處找到Github存儲庫: https//github.com/node-inspector/node-inspector


本機調試

您也可以通過以下方式啟動它本地調試node.js:

node debug your-script.js
 

要在您想要的代碼行中完全斷開調試器,請使用以下命令:

debugger;
 

有關更多信息,請參見此處

在node.js 8中使用以下命令:

node --inspect-brk your-script.js
 

然後打開about://inspect 在最新版本的Google Chrome中about://inspect 並選擇您的Node腳本以獲得Chrome DevTools的調試體驗。

在線部署您的應用程序

將應用程序部署到(Node.js特定的)託管環境時,此環境通常會提供可用於運行服務器的PORT 環境變量。將端口號更改為process.env.PORT 允許您訪問該應用程序。

例如,

http.createServer(function(request, response) {
   // your server code
}).listen(process.env.PORT);
 

此外,如果您想在調試時訪問此脫機,可以使用以下命令:

http.createServer(function(request, response) {
  // your server code
}).listen(process.env.PORT || 3000);
 

其中3000 是離線端口號。

Hello World基本路由

了解瞭如何使用節點創建HTTP服務器之後 ,了解如何根據用戶導航到的路徑“執行”操作非常重要。這種現象稱為“路由”。

最基本的例子是檢查if (request.url === 'some/path/here') ,然後調用一個用新文件響應的函數。

這方面的一個例子可以在這裡看到:

const http = require('http');

function index (request, response) {
    response.writeHead(200);
    response.end('Hello, World!');
}

http.createServer(function (request, response) {
    
    if (request.url === '/') {
        return index(request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

但是,如果你繼續定義這樣的“路線”,你最終會得到一個巨大的回調函數,我們不希望像這樣的巨大混亂,所以讓我們看看我們是否可以清理它。

首先,讓我們將所有路由存儲在一個對像中:

var routes = {
    '/': function index (request, response) {
        response.writeHead(200);
        response.end('Hello, World!');
    },
    '/foo': function foo (request, response) {
        response.writeHead(200);
        response.end('You are now viewing "foo"');
    }
}
 

現在我們已經在一個對像中存儲了2個路由,現在我們可以在主回調中檢查它們:

http.createServer(function (request, response) {
    
    if (request.url in routes) {
        return routes[request.url](request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

現在,每次嘗試瀏覽網站時,都會檢查路徑中是否存在該路徑,並調用相應的功能。如果未找到路由,則服務器將以404(未找到)進行響應。

而且你有它 - 使用HTTP Server API進行路由非常簡單。

Hello World命令行

Node.js也可用於創建命令行實用程序。下面的示例從命令行讀取第一個參數並打印Hello消息。

要在Unix系統上運行此代碼:

  1. 創建一個新文件並粘貼下面的代碼。文件名無關緊要。
  2. 使用chmod 700 FILE_NAME 使此文件可執行
  3. 使用./APP_NAME David 運行該應用

在Windows上,您執行步驟1並使用node APP_NAME David 運行它

#!/usr/bin/env node

'use strict';

/*
    The command line arguments are stored in the `process.argv` array, 
    which has the following structure:
    [0] The path of the executable that started the Node.js process
    [1] The path to this application
    [2-n] the command line arguments

    Example: [ '/bin/node', '/path/to/yourscript', 'arg1', 'arg2', ... ]
    src: https://nodejs.org/api/process.html#process_process_argv
 */

// Store the first argument as username.
var username = process.argv[2];

// Check if the username hasn't been provided.
if (!username) {

    // Extract the filename
    var appName = process.argv[1].split(require('path').sep).pop();

    //  Give the user an example on how to use the app.
    console.error('Missing argument! Example: %s YOUR_NAME', appName);

    // Exit the app (success: 0, error: 1). 
    // An error will stop the execution chain. For example:
    //   ./app.js && ls       -> won't execute ls
    //   ./app.js David && ls -> will execute ls
    process.exit(1);
}

// Print the message to the console.
console.log('Hello %s!', username);
 

REPL中的Hello World

當不帶參數調用時,Node.js啟動一個REPL(Read-Eval-Print-Loop),也稱為“ Node shell ”。

在命令提示符下鍵入node

$ node
>
 

在Node shell提示符下> 鍵入“Hello World!”

$ node
> "Hello World!"
'Hello World!'
 

快樂你好世界

以下示例使用Express創建偵聽端口3000的HTTP服務器,該服務器以“Hello,World!”響應。 Express是一種常用的Web框架,可用於創建HTTP API。

首先,創建一個新文件夾,例如myApp 。進入myApp 並創建一個包含以下代碼的新JavaScript文件(例如,將其hello.jshello.js )。然後使用命令行中的npm install --save express 安裝express模塊。 有關如何安裝軟件包的更多信息,請參閱此文檔

// Import the top-level function of express
const express = require('express');

// Creates an Express application using the top-level function
const app = express();

// Define port number as 3000
const port = 3000;

// Routes HTTP GET requests to the specified path "/" with the specified callback function
app.get('/', function(request, response) {
  response.send('Hello, World!');
});

// Make the app listen on port 3000
app.listen(port, function() {
  console.log('Server listening on http://localhost:' + port);
});
 

從命令行運行以下命令:

node hello.js
 

打開瀏覽器並導航到http://localhost:3000http://127.0.0.1:3000 以查看響應。

有關Express框架的更多信息,您可以查看Web Apps With Express部分

如何啟動並運行基本的HTTPS Web服務器!

在系統上安裝了node.js後,您只需按照以下步驟操作即可運行支持HTTP和HTTPS的基本Web服務器!



第1步:構建證書頒發機構

  1. 創建要存儲密鑰和證書的文件夾:

    mkdir conf


  1. 轉到該目錄:

    cd conf


  1. 抓住這個ca.cnf 文件,用作配置快捷方式:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


  1. 使用此配置創建新的證書頒發機構:

    openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


  1. 既然我們在ca-key.pemca-cert.pem 擁有我們的證書權限,那麼讓我們為服務器生成一個私鑰:

    openssl genrsa -out key.pem 4096


  1. 抓取此server.cnf 文件以用作配置快捷方式:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


  1. 使用此配置生成證書籤名請求:

    openssl req -new -config server.cnf -key key.pem -out csr.pem


  1. 簽署請求:

    openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem



步驟2:將證書安裝為根證書

  1. 將您的證書複製到根證書的文件夾:

    sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem


  1. 更新CA商店:

    sudo update-ca-certificates



第3步:啟動節點服務器

首先,您要創建一個包含實際服務器代碼的server.js 文件。

Node.js中HTTPS服務器的最小設置如下:

var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);
 

如果您還想支持http請求,則需要進行以下小修改:

var http = require('http');
var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
 
  1. 轉到server.js 所在的目錄:

    cd /path/to


  1. 運行server.js

    node server.js

安裝和運行Node.js.

首先,在開發計算機上安裝Node.js.

Windows:導航到下載頁面並下載/運行安裝程序。

Mac:導航到下載頁面並下載/運行安裝程序。或者,您可以使用brew install node 通過Homebrew brew install node 。 Homebrew是Macintosh的命令行程序包管理器,有關它的更多信息可以在Homebrew網站上找到。

Linux:命令行安裝頁面上按照發行版的說明進行操作。


運行節點程序

要運行Node.js程序,只需運行node app.jsnodejs app.js ,其中app.js 是節點應用程序源代碼的文件名。您不需要為Node包含.js 後綴來查找您要運行的腳本。

或者,在基於UNIX的操作系統下,節點程序可以作為終端腳本執行。為此,它需要從指向節點解釋器的shebang開始,例如#!/usr/bin/env node 。該文件還必須設置為可執行文件,可以使用chmod 完成。現在可以從命令行直接運行腳本。

TLS套接字:服務器和客戶端

此常規TCP連接與常規TCP連接之間的唯一主要區別是私鑰和公共證書,您必須將其設置為選項對象。

如何創建密鑰和證書

此安全過程的第一步是創建私鑰。什麼是私鑰?基本上,它是一組用於加密信息的隨機噪聲。從理論上講,您可以創建一個密鑰,並使用它來加密您想要的任何密鑰。但最佳做法是為特定事物設置不同的密鑰。因為如果有人偷了你的私鑰,那就像是有人偷了你的房門鑰匙。想像一下,如果你使用相同的鑰匙來鎖定你的車,車庫,辦公室等。

openssl genrsa -out private-key.pem 1024

一旦我們擁有了私鑰​​,我們就可以創建一個CSR(證書籤名請求),這是我們要求由一個花哨的權威機構簽署私鑰的請求。這就是您必須輸入與貴公司相關的信息的原因。簽名機構將查看此信息,並用於驗證您。在我們的例子中,你鍵入的內容並不重要,因為在下一步我們將自己簽署我們的證書。

openssl req -new -key private-key.pem -out csr.pem

現在我們已經完成了我們的論文工作,現在是時候假裝我們是一個很酷的簽名機構。

openssl x509 -req -in csr.pem -signkey private-key.pem -out public-cert.pem

現在您擁有了私鑰​​和公共證書,您可以在兩個NodeJS應用程序之間建立安全連接。而且,正如您在示例代碼中看到的那樣,這是一個非常簡單的過程。

重要!

自從我們自己創建公共證書以來,我們的證書毫無價值,因為我們是無名小卒。默認情況下,NodeJS服務器不會信任這樣的證書,這就是為什麼我們需要告訴它實際信任我們的證書,並使用以下選項rejectUnauthorized:false。 非常重要 :永遠不要在生產環境中將此變量設置為true。

TLS套接字服務器

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem')
};

var server = tls.createServer(options, function(socket) {

    // Send a friendly message
    socket.write("I am the server sending you a message.");

    // Print the data that we received
    socket.on('data', function(data) {

        console.log('Received: %s [it is %d bytes long]',
            data.toString().replace(/(\n)/gm,""),
            data.length);

    });

    // Let us know when the transmission is over
    socket.on('end', function() {

        console.log('EOT (End Of Transmission)');

    });

});

// Start listening on a specific port and address
server.listen(PORT, HOST, function() {

    console.log("I'm listening at %s, on port %s", HOST, PORT);

});

// When an error occurs, show it.
server.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    server.destroy();

});
 

TLS套接字客戶端

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

// Pass the certs to the server and let it know to process even unauthorized certs.
var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem'),
    rejectUnauthorized: false
};

var client = tls.connect(PORT, HOST, options, function() {

    // Check if the authorization worked
    if (client.authorized) {
        console.log("Connection authorized by a Certificate Authority.");
    } else {
        console.log("Connection not authorized: " + client.authorizationError)
    }

    // Send a friendly message
    client.write("I am the client sending you a message.");

});

client.on("data", function(data) {

    console.log('Received: %s [it is %d bytes long]',
        data.toString().replace(/(\n)/gm,""),
        data.length);

    // Close the connection after receiving the message
    client.end();

});

client.on('close', function() {

    console.log("Connection closed");

});

// When an error ocoures, show it.
client.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    client.destroy();

});