Swoole 快速起步:創建 TCP 服務器

TCP 協議 (Transport Control Protocol) 屬於傳輸層,在經過三次握手後才建立連接,應用層的大多數協議都基於 TCP 協議完成。

 TCP 服務器腳本

1. 創建腳本:server.php

<?php
// 創建 Server 對象,監聽 127.0.0.1:9501端口
$serv = new Swoole\Server("127.0.0.1", 9501);

// 配置
$serv->set([
    // 守護進程
    "daemonize" => 0,
    // 進程數量,爲CPU核數的1-4倍
    "worker_man" => 8,
    // 更多配置:https://wiki.swoole.com/wiki/page/13.html
]);

/**
 * 監聽連接進入事件
 * $serv 創建的 Server 對象
 * $fd 是TCP客戶端連接的標識符
 * $reactor_id 是來自於哪個reactor線程
 */
$serv->on('Connect', function ($serv, $fd, $reactorId) {
    echo "Client:{$fd} Connect.\n";
});

/**
 * 監聽數據接收事件
 * $data,收到的數據內容,可能是文本或者二進制內容
 */
$serv->on('Receive', function ($serv, $fd, $reactorId, $data) {
    // 向客戶端發送消息
    $serv->send($fd, "Server: " . $data);
});

// 監聽連接關閉事件
$serv->on('Close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

// 更多監聽事件:https://wiki.swoole.com/wiki/page/41.html

// 啓動服務器
$serv->start();

2. 執行程序:

php73 ./tcp_server.php 

可能遇到報錯:(端口被佔用

[2019-09-22 16:43:03 @29769.0]    WARNING    swSocket_bind(:434): bind(127.0.0.1:9501) failed, Error: Address already in use[98]
PHP Fatal error:  Uncaught Swoole\Exception: failed to listen server port[127.0.0.1:9501], Error: Address already in use[98] in /var/www/swoole/demo/tcp/tcp_server.php:3

解決:(查看端口 & kill it

[root@atong tcp]# netstat -anp | grep 9501
tcp        0      0 127.0.0.1:9501          0.0.0.0:*               LISTEN      29765/php73         
[root@atong tcp]# kill 29765

3. 另開窗口 用telnet/netcat工具連接:

[root@atong tcp]# telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

 輸入內容

hello world ..

立即返回

Server: hello world

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章