-
Notifications
You must be signed in to change notification settings - Fork 0
Recipe Echo Server
Muhammet Şafak edited this page May 24, 2026
·
1 revision
The smallest server that demonstrates accept, read and write. We do it twice — once over TCP, once over UDP — so the differences are visible side by side.
tcp-echo-server.php:
<?php
require __DIR__ . '/vendor/autoload.php';
use InitPHP\Socket\Socket;
use InitPHP\Socket\Enum\Transport;
use InitPHP\Socket\Interfaces\{SocketServerInterface, SocketConnectionInterface};
$server = Socket::server(Transport::TCP, '127.0.0.1', 9000);
$server->listen();
echo "TCP echo on 127.0.0.1:9000\n";
$server->live(function (SocketServerInterface $srv, SocketConnectionInterface $conn) {
$payload = $conn->read(1024);
if ($payload === null) {
return;
}
$conn->write("echo: {$payload}");
});php tcp-echo-server.phpFrom another terminal:
$ nc 127.0.0.1 9000
hi
echo: hitcp-echo-client.php:
<?php
require __DIR__ . '/vendor/autoload.php';
use InitPHP\Socket\Socket;
use InitPHP\Socket\Enum\Transport;
$client = Socket::client(Transport::TCP, '127.0.0.1', 9000);
$client->connect();
$client->write("hello\n");
echo $client->read(1024); // -> "echo: hello\n"
$client->disconnect();udp-echo-server.php:
<?php
require __DIR__ . '/vendor/autoload.php';
use InitPHP\Socket\Socket;
use InitPHP\Socket\Enum\Transport;
use InitPHP\Socket\Interfaces\{SocketServerInterface, SocketConnectionInterface};
$server = Socket::server(Transport::UDP, '127.0.0.1', 9001);
$server->listen();
echo "UDP echo on 127.0.0.1:9001\n";
$server->live(function (SocketServerInterface $srv, SocketConnectionInterface $conn) {
$payload = $conn->read(65535);
if ($payload === null) {
return;
}
$conn->write("echo: {$payload}");
});php udp-echo-server.phpFrom another terminal:
$ echo -n 'ping' | nc -u -w1 127.0.0.1 9001
echo: pingudp-echo-client.php:
<?php
require __DIR__ . '/vendor/autoload.php';
use InitPHP\Socket\Socket;
use InitPHP\Socket\Enum\Transport;
$client = Socket::client(Transport::UDP, '127.0.0.1', 9001);
$client->connect();
$client->write('ping');
echo $client->read(65535);
$client->disconnect();- The transport enum case (
TCPvsUDP). - Read buffer size: 1 KiB is plenty for ad-hoc TCP framing; UDP needs to be big enough for one whole datagram (
UdpChannel::MAX_DATAGRAM = 65535). - UDP has no half-close and no notion of disconnection on the server side. If a client stops talking, the server still keeps its
UdpChannel. Evict idle peers with an application-level TTL — see Transport UDP.
- Lifecycle:
listen()→live(callback)→close()(clean shutdown). - The callback signature
(SocketServerInterface, SocketConnectionInterface). -
$conn->read()returns?string,$conn->write()returns?int.
- Transport TCP / Transport UDP — transport-specific details.
- Recipe Broadcast — fan out a message to multiple peers.
-
Event Loop Integration — drive the same server from
tick()instead oflive().
initphp/socket · MIT · PHP 8.1+ · part of the InitPHP family · file issues at InitPHP/Socket/issues
Getting started
Transports
Concepts
Reference
Recipes
Operational