24
24
25
25
Known Issues
26
26
-------------
27
- * SSL support not well field tested.
28
27
* Lacks ORIGIN checking (can be implemented manually in onConnect using getHeaders(), just disconnect the user when you dont like the Origin header)
29
28
* No support for extension data from the HyBi specs.
30
29
@@ -35,6 +34,12 @@ Requirements
35
34
* Open port for the server
36
35
* PHP OpenSSL module to run a server over a encrypted connection
37
36
37
+ * Composer dependencies *
38
+ These will be installed automatically when using phpws as a composer package.
39
+
40
+ * Reactphp
41
+ * ZF2 Logger
42
+
38
43
* Client*
39
44
* PHP 5.3
40
45
* Server that implements the HyBi (#8 -#12 ) draft version
@@ -43,97 +48,61 @@ Requirements
43
48
Server Example
44
49
---------------
45
50
``` php
46
- #!/php -q
47
- <?php
48
-
49
- // Run from command prompt > php demo.php
50
-
51
- /**
52
- * This demo resource handler will respond to all messages sent to /echo/ on the socketserver below
53
- *
54
- * All this handler does is echoing the responds to the user
55
- * @author Chris
56
- *
57
- */
58
- class DemoEchoHandler extends WebSocketUriHandler{
59
- public function onMessage(IWebSocketConnection $user, IWebSocketMessage $msg){
60
- echo "[ECHO] {$msg->getData()}\n";
61
- // Echo
62
- $user->sendMessage($msg);
63
- }
64
-
65
- public function onAdminMessage(IWebSocketConnection $user, IWebSocketMessage $obj){
66
- echo "[DEMO] Admin TEST received!\n";
67
-
68
- $frame = WebSocketFrame::create(WebSocketOpcode::PongFrame);
69
- $user->sendFrame($frame);
70
- }
71
- }
72
-
73
- /**
74
- * Demo socket server. Implements the basic eventlisteners and attaches a resource handler for /echo/ urls.
75
- *
76
- *
77
- * @author Chris
78
- *
79
- */
80
- class DemoSocketServer implements IWebSocketServerObserver{
81
- protected $debug = true;
82
- protected $server;
83
-
84
- public function __construct(){
85
- $this->server = new WebSocketServer('tcp://0.0.0.0:12345', 'superdupersecretkey');
86
- $this->server->addObserver($this);
87
-
88
- $this->server->addUriHandler("echo", new DemoEchoHandler());
89
- }
90
-
91
- public function onConnect(IWebSocketConnection $user){
92
- echo "[DEMO] {$user->getId()} connected\n";
93
- }
94
-
95
- public function onMessage(IWebSocketConnection $user, IWebSocketMessage $msg){
96
- echo "[DEMO] {$user->getId()} says '{$msg->getData()}'\n";
97
- }
98
-
99
- public function onDisconnect(IWebSocketConnection $user){
100
- echo "[DEMO] {$user->getId()} disconnected\n";
101
- }
102
-
103
- public function onAdminMessage(IWebSocketConnection $user, IWebSocketMessage $msg){
104
- echo "[DEMO] Admin Message received!\n";
105
-
106
- $frame = WebSocketFrame::create(WebSocketOpcode::PongFrame);
107
- $user->sendFrame($frame);
108
- }
109
-
110
- public function run(){
111
- $this->server->run();
112
- }
113
- }
114
-
115
- // Start server
116
- $server = new DemoSocketServer();
117
- $server->run();
51
+ require_once("vendor/autoload.php"); // Composer autoloader
52
+
53
+ use Devristo\Phpws\Messaging\WebSocketMessageInterface;
54
+ use Devristo\Phpws\Protocol\WebSocketConnectionInterface;
55
+ use Devristo\Phpws\Server\WebSocketServer;
56
+
57
+ $loop = \React\EventLoop\Factory::create();
58
+
59
+ // Create a logger which writes everything to the STDOUT
60
+ $logger = new \Zend\Log\Logger();
61
+ $writer = new Zend\Log\Writer\Stream("php://output");
62
+ $logger->addWriter($writer);
63
+
64
+ // Create a WebSocket server using SSL
65
+ $server = new WebSocketServer("tcp://0.0.0.0:12345", $loop, $logger);
66
+
67
+ $server->on("connect", function(WebSocketConnectionInterface $user){
68
+ $user->sendString("Hey! I am the echo robot. I will repeat all your input!");
69
+ });
70
+
71
+ $server->on("message", function(WebSocketConnectionInterface $user, WebSocketMessageInterface $message) use($logger){
72
+ $logger->notice(sprintf("We have got '%s' from client %s", $message->getData(), $user->getId()));
73
+ $user->sendString($message->getData());
74
+ });
75
+
76
+ // Bind the server
77
+ $server->bind();
78
+
79
+ // Start the event loop
80
+ $loop->run();
118
81
```
119
82
120
83
Client Example
121
84
---------------------
122
85
``` php
123
- <?php
86
+ require_once("vendor/autoload.php"); // Composer autoloader
87
+
88
+ $loop = \React\EventLoop\Factory::create();
124
89
125
- $input = "Hello World!";
126
- $msg = WebSocketMessage::create($input);
90
+ $logger = new \Zend\Log\Logger();
91
+ $writer = new Zend\Log\Writer\Stream("php://output");
92
+ $logger->addWriter($writer);
127
93
128
- $client = new WebSocket("ws://127.0.0.1:12345/echo/");
129
- $client->open();
130
- $client->sendMessage($msg);
94
+ $client = new \Devristo\Phpws\Client\WebSocket("ws://echo.websocket.org/?encoding=text", $loop, $logger);
95
+ $client->on("connected", function($headers) use ($logger, $client){
96
+ $logger->notice("Connected!");
97
+ $client->send("Hello world!");
98
+ });
131
99
132
- // Wait for an incoming message
133
- $msg = $client->readMessage();
100
+ $client->on("message", function($message) use ($client, $logger){
101
+ $logger->notice("Got message: ".$message->getData());
102
+ $client->close();
103
+ });
134
104
135
- $client->close();
136
105
137
- echo $msg->getData (); // Prints "Hello World!" when using the demo.php server
138
- ?>
106
+ $client->open ();
107
+ $loop->run();
139
108
```
0 commit comments