ホームページ ウェブフロントエンド jsチュートリアル WebSocket、Socket.IO、Node.js によるリアルタイム通信

WebSocket、Socket.IO、Node.js によるリアルタイム通信

Sep 27, 2024 pm 10:40 PM

WebSockets, Socket.IO, and Real-Time Communication with Node.js

Komunikasi masa nyata telah menjadi ciri utama aplikasi moden, membolehkan kemas kini segera, pertukaran data langsung dan pengalaman pengguna yang responsif. Teknologi seperti WebSockets dan Socket.IO berada di barisan hadapan dalam interaksi masa nyata. Artikel ini akan menyelidiki konsep WebSockets, cara melaksanakannya dalam Node.js dan cara Socket.IO memudahkan komunikasi masa nyata.

Apakah itu WebSocket?

WebSocket ialah protokol komunikasi yang menyediakan saluran komunikasi dupleks penuh melalui satu sambungan TCP. Tidak seperti protokol HTTP, yang beroperasi dalam model tindak balas permintaan, WebSocket membenarkan pelayan dan klien menghantar mesej antara satu sama lain pada bila-bila masa, mengekalkan sambungan terbuka.

Ciri-ciri Utama:

  • Sambungan Berterusan: WebSocket memastikan sambungan terbuka, mengurangkan keperluan untuk mewujudkan semula sambungan.
  • Komunikasi Dwi Arah: Kedua-dua pelayan dan pelanggan boleh menghantar mesej secara bebas.
  • Latensi Rendah: Memandangkan WebSocket mengekalkan sambungan terbuka, ia menghapuskan overhed permintaan HTTP, mengurangkan kependaman.

Bila hendak menggunakan WebSockets?

WebSockets sesuai untuk aplikasi yang memerlukan pertukaran data masa nyata dan kependaman rendah:

  • Aplikasi sembang (cth., Slack, WhatsApp Web)
  • Kemas kini sukan secara langsung
  • Suapan pasaran saham
  • Alat kerjasama masa nyata (cth., Dokumen Google)

Menyediakan WebSocket dalam Node.js

Node.js menyokong WebSocket secara asli melalui pakej ws, perpustakaan yang ringan dan cekap untuk komunikasi WebSocket.

Langkah 1: Pasang Pakej WebSocket

npm install ws
ログイン後にコピー

Langkah 2: Buat Pelayan WebSocket

const WebSocket = require('ws');

// Create a WebSocket server that listens on port 8080
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
    console.log('Client connected');

    // When the server receives a message
    ws.on('message', (message) => {
        console.log('Received:', message);
        // Echo the message back to the client
        ws.send(`Server received: ${message}`);
    });

    // Handle connection close
    ws.on('close', () => {
        console.log('Client disconnected');
    });
});

console.log('WebSocket server is running on ws://localhost:8080');
ログイン後にコピー

Penjelasan:

  • Pelayan WebSocket mendengar pada port 8080.
  • Acara sambungan dicetuskan apabila pelanggan menyambung.
  • Acara mesej dicetuskan apabila pelayan menerima data daripada klien, yang kemudiannya bergema kembali.

Langkah 3: Buat Pelanggan WebSocket

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {
    console.log('Connected to WebSocket server');
    // Send a message to the server
    ws.send('Hello Server!');
});

ws.on('message', (data) => {
    console.log('Received from server:', data);
});

ws.on('close', () => {
    console.log('Disconnected from server');
});
ログイン後にコピー

Output:

Server Console:
Client connected
Received: Hello Server!
Client disconnected

Client Console:
Connected to WebSocket server
Received from server: Server received: Hello Server!
Disconnected from server
ログイン後にコピー

Apakah itu Socket.IO?

Socket.IO ialah perpustakaan popular yang dibina di atas WebSockets yang memudahkan komunikasi masa nyata. Ia menyediakan abstraksi peringkat lebih tinggi, menjadikannya lebih mudah untuk melaksanakan dan mengurus acara masa nyata. Socket.IO juga menyokong mekanisme sandaran untuk penyemak imbas yang tidak menyokong WebSockets, memastikan keserasian yang luas.

Kelebihan Socket.IO:

  • Sambungan Semula Automatik: Secara automatik cuba menyambung semula jika sambungan terputus.
  • Ruang nama dan Bilik: Mengatur sambungan ke dalam ruang nama dan bilik, membolehkan komunikasi yang lebih berstruktur.
  • Model dipacu peristiwa: Menyokong acara tersuai, menjadikan komunikasi lebih semantik.

Menggunakan Socket.IO dengan Node.js

Langkah 1: Pasang Socket.IO

npm install socket.io
ログイン後にコピー

Langkah 2: Sediakan Pelayan Socket.IO

const http = require('http');
const socketIo = require('socket.io');

// Create an HTTP server
const server = http.createServer();
const io = socketIo(server, {
    cors: {
        origin: "*",
        methods: ["GET", "POST"]
    }
});

// Handle client connection
io.on('connection', (socket) => {
    console.log('Client connected:', socket.id);

    // Listen for 'chat' events from the client
    socket.on('chat', (message) => {
        console.log('Received message:', message);
        // Broadcast the message to all connected clients
        io.emit('chat', `Server: ${message}`);
    });

    // Handle client disconnect
    socket.on('disconnect', () => {
        console.log('Client disconnected:', socket.id);
    });
});

server.listen(3000, () => {
    console.log('Socket.IO server running on http://localhost:3000');
});
ログイン後にコピー

Penjelasan:

  • Pelayan HTTP dibuat dan Socket.IO dilampirkan padanya.
  • Acara sambungan mengendalikan sambungan pelanggan baharu.
  • Acara sembang ialah acara tersuai untuk menghantar mesej sembang dan memancarkan siaran mesej kepada semua pelanggan.

Langkah 3: Buat Pelanggan Socket.IO

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Chat</title>
</head>
<body>
    <input id="message" type="text" placeholder="Type a message">
    <button id="send">Send</button>
    <ul id="messages"></ul>

    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io('http://localhost:3000');

        // Listen for chat messages from the server
        socket.on('chat', (message) => {
            const li = document.createElement('li');
            li.textContent = message;
            document.getElementById('messages').appendChild(li);
        });

        // Send message to server when button is clicked
        document.getElementById('send').addEventListener('click', () => {
            const message = document.getElementById('message').value;
            socket.emit('chat', message);
        });
    </script>
</body>
</html>
ログイン後にコピー

Output:

Setelah pelayan berjalan dan anda membuka fail HTML dalam berbilang penyemak imbas, mesej yang ditaip dalam satu penyemak imbas akan dihantar ke pelayan dan disiarkan kepada semua pelanggan yang disambungkan.

Strim Node.js

Strim adalah penting untuk mengendalikan fail besar atau data dalam ketulan daripada memuatkan keseluruhan kandungan ke dalam memori. Ia berguna untuk:

  • File Uploads/Downloads: Streams allow you to process data as it’s being uploaded or downloaded.
  • Handling Large Data: Streams are more memory efficient for handling large files or continuous data.

Types of Streams in Node.js:

  1. Readable Streams: Streams from which data can be read (e.g., file system read).
  2. Writable Streams: Streams to which data can be written (e.g., file system write).
  3. Duplex Streams: Streams that can both be read from and written to (e.g., TCP sockets).
  4. Transform Streams: Streams that can modify or transform data as it is written and read (e.g., file compression).

Example: Reading a File Using Streams

const fs = require('fs');

// Create a readable stream
const readStream = fs.createReadStream('largefile.txt', 'utf8');

// Listen to 'data' event to read chunks of data
readStream.on('data', (chunk) => {
    console.log('Reading chunk:', chunk);
});

// Listen to 'end' event when the file is fully read
readStream.on('end', () => {
    console.log('File reading complete');
});
ログイン後にコピー

Scaling Node.js Applications

As your application grows, scaling becomes necessary to handle increased traffic and ensure high availability. Node.js applications can be scaled vertically or horizontally:

  • Vertical Scaling: Increasing the resources (CPU, RAM) of a single machine.
  • Horizontal Scaling: Running multiple instances of your Node.js application across different machines or cores.

Cluster Module in Node.js

Node.js runs on a single thread, but using the cluster module, you can take advantage of multi-core systems by running multiple Node.js processes.

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Fork workers for each CPU
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died`);
    });
} else {
    // Workers can share the same HTTP server
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello, world!\n');
    }).listen(8000);
}
ログイン後にコピー

Conclusion

WebSockets and Socket.IO offer real-time, bi-directional communication essential for modern web applications. Node.js streams efficiently handle large-scale data, and scaling with NGINX and Node’s cluster module ensures your application can manage heavy traffic. Together, these technologies enable robust, high-performance real-time applications.

以上がWebSocket、Socket.IO、Node.js によるリアルタイム通信の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Zustand非同期操作:UseStoreが取得した最新の状態を確保する方法は? Zustand非同期操作:UseStoreが取得した最新の状態を確保する方法は? Apr 04, 2025 pm 02:09 PM

Zustand非同期操作のデータの更新問題。 Zustand State Management Libraryを使用する場合、非同期操作を不当にするデータ更新の問題に遭遇することがよくあります。 �...

See all articles