بروتوكول WebSocket
حاليًا، إصدار بروتوكول WebSocket في Workerman هو 13.
بروتوكول WebSocket هو بروتوكول جديد من HTML5. وهو يحقق الاتصال الثنائي الاتجاه بين المتصفح والخادم.
العلاقة بين WebSocket و TCP
بروتوكول WebSocket، مثل HTTP، هو بروتوكول على مستوى التطبيق، وهو يعتمد على نقل TCP. بروتوكول WebSocket نفسه ليس له علاقة كبيرة بـ Socket، ولا يمكن المساواة بينهما.
مصافحة بروتوكول WebSocket
يتضمن بروتوكول WebSocket عملية مصافحة، حيث يتم التواصل بين المتصفح والخادم عبر بروتوكول HTTP أثناء المصافحة. في Workerman يمكن التدخل في عملية المصافحة بهذه الطريقة.
عندما تكون workerman <= 4.1
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Connection\TcpConnection;
use Workerman\Worker;
$ws = new Worker('websocket://0.0.0.0:8181');
$ws->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $httpBuffer)
{
// يمكن هنا التحقق مما إذا كانت مصدر الاتصال قانوني، إذا كان غير قانوني، قم بإغلاق الاتصال
// $_SERVER['HTTP_ORIGIN'] تُعرف من أي موقع تم بدء اتصال websocket
if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
{
$connection->close();
}
// $_GET و $_SERVER متاحة في onWebSocketConnect
// var_dump($_GET, $_SERVER);
};
};
Worker::runAll();
عندما تكون workerman >= 5.0
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
$worker = new Worker('websocket://0.0.0.0:12345');
$worker->onWebSocketConnect = function (TcpConnection $connection, Request $request) {
if ($request->header('origin') != 'https://www.workerman.net') {
$connection->close();
}
var_dump($request->get());
var_dump($request->header());
};
Worker::runAll();
نقل البيانات ثنائية البُعد عبر بروتوكول WebSocket
بروتوكول WebSocket افتراضيًا يمكنه نقل نصوص UTF-8 فقط، إذا كنت تريد نقل بيانات ثنائية، يرجى قراءة القسم التالي.
يستخدم بروتوكول WebSocket في رأس البروتوكول علامة لتحديد ما إذا كان يتم نقل بيانات ثنائية أو نصوص UTF-8، سيتحقق المتصفح من توافق العلامة مع نوع المحتوى المنقول، وإذا لم يتطابق، سيتم قطع الاتصال مع الإبلاغ عن خطأ.
لذلك، عند إرسال البيانات من الخادم، يجب إعداد هذه العلامة بناءً على نوع البيانات المنقولة، في Workerman، إذا كانت نصوص UTF-8 عادية، يجب إعدادها (الافتراضي هو هذه القيمة، عادة لا حاجة لإعدادها يدويًا)
use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_BLOB;
إذا كانت بيانات ثنائية، يجب إعدادها
use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
ملاحظة: إذا لم يتم إعداد $connection->websocketType، فإن $connection->websocketType يكون افتراضيًا BINARY_TYPE_BLOB (أي نوع نص UTF-8). عادةً ما تكون البيانات المنقولة هي نصوص UTF-8، مثل نقل بيانات JSON، لذلك لا حاجة لإعداد $connection->websocketType يدويًا. يجب إعداد هذه الخاصية على BINARY_TYPE_ARRAYBUFFER فقط عند نقل بيانات ثنائية (مثل بيانات الصور، بيانات بروتوكول بروتوبوفر، إلخ).
استخدام Workerman كعميل WebSocket
يمكن استخدام فئة AsyncTcpConnection مع بروتوكول ws لجعل Workerman كعميل WebSocket يتصل بالخادم البعيد WebSocket، مما يتيح التواصل الثنائي الاتجاه في الوقت الحقيقي.