Thử nghiệm WebSocket với Swoole - 228kbet
]( "Thử nghiệm WebSocket với Swoole") Thử nghiệm WebSocket với Swoole
WebSocket là một giao thức được giới thiệu từ HTML5, cho phép truyền thông hai chiều trên cùng một kết nối TCP. Giao thức này đã được IETF chuẩn hóa vào năm 2011 theo tiêu chuẩn RFC 6455, và API của WebSocket cũng đã được W3C công nhận. WebSocket thường được sử dụng trong các ứng dụng như nhắn tin riêng tư trên web hay hệ thống trò chuyện trực tiếp (IM). Để hiểu rõ hơn về bối cảnh cũng như ưu nhược điểm của nó, bạn có thể tham khảo thêm tại Wikipedia.
[Chuẩn bị môi trường]
Do Swoole không hỗ trợ Windows, vì vậy cần cài đặt Linux. Trước đây mình thường dùng Ubuntu, nhưng lần này sẽ thử CentOS 7 – phiên bản này khá đẹp mắt. Mặc dù máy ảo sẽ cài đặt cấu hình tối thiểu theo mặc định, bạn có thể chọn tùy chọn cài đặt kèm GNOME nếu muốn giao diện đồ họa. Tất nhiên, cấu hình tối thiểu vẫn hoàn toàn khả thi, chỉ cần chỉnh sửa tường lửa sau khi cài xong. Sau đó, tiến hành cài PHP, Nginx và các phần mềm liên quan. Mình sử dụng Oneinstack để cài đặt các thành phần này, rất tiện lợi và linh hoạt. Nếu thấy hữu ích, đừng quên gửi lời cảm ơn đến tác giả.
]( "Swoole") Cài đặt Swoole
-
Cài qua PECL
1pecl install swoole
-
Cài từ nguồn
1sudo apt-get install php5-dev 2git clone https://github.com/swoole/swoole-src.git 3cd swoole-src 4phpize 5./configure 6make && [Trang Cá Cược](/post/1c83746fd5b5dee3.html) make install
-
Thêm phần mở rộng
1extension = swoole.so
-
Kiểm tra phần mở rộng
1php -m | grep swoole
Nếu xuất hiện dòng swoole
, tức là cài đặt đã thành công!
[Thực thi mã nguồn]
Mã nguồn bên dưới dựa trên một ví dụ mà mình tìm thấy từ một lập trình viên khác. Dưới đây là đoạn mã thực hiện cho cả phía máy chủ và phía khách hàng.
Máy chủ:
1// Tạo đối tượng máy chủ WebSocket, lắng nghe cổng 9502 tại địa chỉ IP 0.0.0.0
2$ws = new swoole_websocket_server("0.0.0.0", 9502);
3
4// Lắng nghe sự kiện khi kết nối WebSocket được mở
5$ws->on('open', function ($ws, $request) {
6 $fd[] = $request->fd;
7 $GLOBALS['fd'][] = $fd;
8 // Phân biệt người dùng hiện tại
9 $ws->push($request->fd, "Xin chào người dùng {$request->fd}, chào mừng bạn!\n");
10});
11
12// Lắng nghe sự kiện khi nhận được tin nhắn từ WebSocket
13$ws->on('message', function ($ws, $frame) {
14 $msg = 'Từ' . $frame->fd . ":{$frame->data}\n";
15 foreach ($GLOBALS['fd'] as $aa) {
16 foreach ($aa as $i) {
17 if ($i != $frame->fd) {
18 $ws->push($i, $msg);
19 }
20 }
21 }
22});
23
24// Lắng nghe sự kiện khi kết nối WebSocket bị đóng
25$ws->on('close', function ($ws, $fd) {
26 echo "Khách hàng-{$fd} đã đóng kết nối\n";
27});
28
29$ws->start();
Khách kết quả tỷ số hàng:
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>Giao diện WebSocket</title>
6</head>
7<body>
8<div id="msg"></div>
9<input type="text" id="text">
10<input type="submit" value="Gửi dữ liệu" onclick="gui()">
11
12<script>
13var msg = document.getElementById("msg");
14var wsServer = 'ws://0.0.0.0:9502';
15var websocket = new WebSocket(wsServer);
16
17websocket.onopen = function (evt) {
18 msg.innerHTML = websocket.readyState;
19};
20
21function gui() {
22 var text = document.getElementById('text').value;
23 document.getElementById('text').value = '';
24 websocket.send(text);
25}
26
27websocket.onmessage = function (evt) {
28 msg.innerHTML += evt.data + '<br>';
29};
30</script>
31</body>
32</html>