WebSocket Protokolü
currently Workerman'ın WebSocke protokol sürümü 13'tür.
WebSocket protokolü, HTML5'in yeni bir protokolüdür. Tarayıcı ile sunucu arasında tam çift yönlü iletişim sağlar.
WebSocket ve TCP İlişkisi
WebSocket, HTTP gibi bir uygulama katmanı protokolüdür ve TCP üzerinden iletilir. WebSocket'in kendisi ile Socket arasında pek bir ilişki yoktur, bu yüzden eşit tutulamaz.
WebSocket Protokolü El Sıkışması
WebSocket protokolünün bir el sıkışma süreci vardır; el sıkışma sırasında tarayıcı ve sunucu HTTP protokolü ile iletişim kurmaktadır. Workerman içinde el sıkışma sürecine şu şekilde müdahale edilebilir.
workerman <= 4.1 olduğunda
<?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)
{
// Burada bağlantının kaynağının geçerli olup olmadığını kontrol edebilirsiniz, geçerli değilse bağlantıyı kapatın
// $_SERVER['HTTP_ORIGIN'] websocket bağlantısının hangi siteden yapıldığını belirtir
if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net')
{
$connection->close();
}
// onWebSocketConnect içinde $_GET $_SERVER kullanılabilir
// var_dump($_GET, $_SERVER);
};
};
Worker::runAll();
workerman >= 5.0 olduğunda
<?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 Protokolü İkili Veri Taşıma
websocket protokolü varsayılan olarak yalnızca utf8 metinleri iletebilir; ikili veri iletmek istiyorsanız, lütfen aşağıdaki bölümü okuyun.
websocket protokolünde, protokol başlığında, iletilen verinin ikili veri mi yoksa utf8 metin verisi mi olduğunu belirten bir işaretçi kullanılır; tarayıcı bu işaretçi ve iletilen içerik türünün uyumlu olup olmadığını kontrol eder; uyumsuzsa hata verir ve bağlantıyı kapatır.
Bu nedenle, sunucu veri gönderirken iletilen veri türüne göre bu işaretçiyi ayarlamalıdır; Workerman'da eğer normal bir utf8 metni ise, işaretçi ayarlanmalıdır (varsayılan olarak bu değerdir, genellikle manuel olarak ayarlamaya gerek yoktur):
use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_BLOB;
Eğer ikili veri ise, ayarlamak gerekir:
use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
Dikkat: Eğer $connection->websocketType ayarlanmazsa, $connection->websocketType varsayılan olarak BINARY_TYPE_BLOB (yani utf8 metin türü) olur. Genel uygulamalarda iletilenler genellikle utf8 metinlerdir; örneğin json verisi iletildiğinde, bu nedenle $connection->websocketType'u manuel olarak ayarlamaya gerek yoktur. Sadece ikili veri iletildiğinde (örneğin resim verisi, protobuffer verisi vb.) bu özelliği BINARY_TYPE_ARRAYBUFFER olarak ayarlamak gerekir.
Workerman'ı Websocket İstemcisi Olarak Kullanma
AsyncTcpConnection sınıfı kullanılarak ws protokolü ile Workerman'ı uzaktaki websocket sunucusuna bağlanacak bir websocket istemcisi olarak kullanarak iki yönlü gerçek zamanlı iletişim gerçekleştirebilirsiniz.