1. Socket.IO とは?
Socket.IO は、イベント通信に基づくリアルタイム アプリケーション フレームワークであり、インスタント メッセージング、通知とメッセージ プッシュ、リアルタイム分析、およびその他のシナリオで広く使用されています。
Socket.IO は、次の 2 つの部分で構成されています。
サーバー側のモジュール (JSRE は socket.io モジュールを提供しています)。
Socket.IO は、実装を 2 つのレイヤーに分割します。
基礎となるパイプライン: Socket.IO の内部エンジンである Engine.IO 層。
高レベル API: つまり、Sokcet.IO 自体。
Engine.IO は、サーバーとクライアント間の低レベルの接続を確立する役割を担い、その主なタスクは、さまざまな転送とアップグレードのメカニズム、および切断の検出と再接続を処理することです。 クライアントは最初に WebSocket 経由で接続を試みますが、失敗すると長いポーリングのために HTTP にフォールバックします。 したがって、理想的には、次のことが保証されている必要があります。
ブラウザは WebSocket をサポートしています。
クライアントとサーバー間の WebSocket 接続をブロックする要素 (プロキシ、ファイアウォールなど) はありません。
接続が確立されると、上位層は公開された API を介してデータを交換できます。
2. 高レベル API
Socket.IO はイベントベースであり、実際には EventEmitter クラスの継承であり、オブジェクト (エミッター) が名前付きイベントを発行し、関数オブジェクト (リスナー) が呼び出されます。 イベント ドリブンに基づいて、on メソッドを介してイベント名とリスナー関数をリスナーに追加し、emit を介してリスナー関数をトリガーして通信タスクを完了する必要があります。
Socket.IO は、基本的な on()、emit()、removeListener() などを含む EventEmitter のイベント トリガーおよびリスニング関数を実装し、次のような接続ライフ サイクルのいくつかのイベント名もカスタマイズします。
connect は、クライアントが接続したときにトリガーされます。
connection は connect の別名です。
disconnect 接続が切断されたときにトリガーされます。
disconnecting クライアントが切断しようとしている (ルームを離れていない) ときにトリガーされます。
これらは Socket.IO (および newListener、removeListener) の予約済みフィールドであり、カスタマイズ時にこれらのフィールドと名前が重複しないようにする必要があります。
3. JSRE の参照
JSREはSocket.IOのモジュールを提供しており、サーバー側で直接利用することができます.JSREでのSocket.IOの現在のバージョンは2.xであり、フロントエンドはバージョン対応に注意する必要があります. Socket.IO モジュールを使用します。
では、Socket.IO はどのように機能するのでしょうか?
第四に、サーバー側の作成
以下に示すように、サーバー側のサンプル コードです。
const WebApp = require ( 'webapp' ) ;
const io = require ( 'socket.io' ) ;
const myRouter = require ( './routers/rest' ) ;
const app = WebApp. createApp ( ) ;
app. use ( WebApp. static ( './public' ) ) ;
app. use ( '/api' , myRouter) ;
app. get ( '/temp.html' , function ( req, res) {
res. render ( 'temp' , {
time: Date. now ( ) } ) ;
} ) ;
app. start ( ) ;
const socketio = io ( app, {
serveClient: false,
pingInterval: 10000 ,
pingTimeout: 5000
} )
socketio. on ( 'connection' , socket = > {
console. log ( '>> socket connected <<' )
socket. emit ( 'falcon' , 'reply please' )
socket. on ( 'message' , ( data, ack) = > {
console. log ( 'recive:' , data)
ack ( '0' )
} )
socket. on ( 'message2' , data = > {
console. log ( 'recive:' , data)
} )
} )
require ( 'iosched' ) . forever ( ) ;
ご覧のとおり、Socket.IO サーバーを作成するのは非常に簡単です.webapp のインスタンスをパラメーターとして渡し、接続方法を監視するだけです。 emit はメッセージを発行し、メッセージの内容は必要に応じて定義できます. 単純な文字列または構造化された JSON オブジェクトにすることができます.
上記の例のように、socket.on でリッスン メッセージ フィールドを定義します。データを受信して処理するか、ack を指定して確認情報を返すことしかできません。 socket.emit は、確認応答を行うための response の return 関数もサポートしています。
socket. emit ( 'ferret' , 'tobi' , ( data) = > {
console. log ( data) ;
} ) ;
client. on ( 'ferret' , ( name, fn) = > {
fn ( 'woot' ) ;
} ) ;
5. クライアントの作成
次に、フロントエンド アプリケーションが Socket.IO を使用して接続を確立し、サーバーと通信する方法を見てみましょう. Vue3 を例として、socket.io-client パッケージを使用します。
npm install socket. io- client
# or use yarn
yarn add socket. io- client
別のページでの呼び出しを容易にするために、socket.io を一度カプセル化することができます。以下は参照用です。
import io from 'socket.io-client'
class SocketIO {
constructor ( ) {
this. socket = io ( 'https://192.168.128.1:7369' )
this. socket. on ( 'connect' , ( ) = > {
console. log ( '>> 已连接!' )
} )
}
push ( event, msg) {
this. socket. emit ( event, msg, ( response) = > {
console. log ( '>>>> res:' , response)
} )
}
}
export const socketio = new SocketIO ( )
6. クライアント接続のライフサイクル
次に、簡単な操作のために別のページでこのパッケージを参照できます。
import {
defineComponent, onMounted } from 'vue'
import './app.less'
import {
socketio } from './libs/socketio'
export default defineComponent ( {
name: 'APP' ,
setup ( props, ctx) {
onMounted ( ( ) = > {
socketio. socket. on ( 'message' , data = > {
console. info ( '>> client recive:' , data)
} )
} )
function handleEmitMsg ( ) {
socketio. push ( 'message' , 'gg' )
}
return ( ) = > (
< div>
< p> < button onClick= {
handleEmitMsg } > emit< / button> < / p>
< / div>
)
}
} )
以上がフロントエンドの監視メッセージとメッセージ送信の操作ですが、このとき特定の操作に対して送信メッセージの返信確認を実行したい場合は、以下の例で取得できます。
function handleEmitMsg ( ) {
socketio. socket. emit ( 'message' , 'data' , response = > {
} )
}
ここまでで Socket.IO の確立プロセスは完全に完了しました. 理解のポイントは、ソケットがイベントに基づく双方向通信のプロセスであることを理解することです. 両端はアクティブなメッセージを送信し、パッシブなメッセージを受信できます.メッセージ名は、メッセージの送信者としてこのメッセージを送信するために発行する必要があり、メッセージの受信者としてこのメッセージを受信するためには on を使用する必要があります。