這篇文章主要介紹了關於swoole建立伺服器之一,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
1.建立tcp伺服器
先照著文檔建立一個tcp伺服器
<?php//建立伺服器 參數分別是 //監聽的地址 127.0.0.1 表示監聽本機,0.0.0.0表示監聽所有地址//9501 連接埠號碼 這個你隨便定都行只要沒被佔用過(netstat -an | grep 查看連接埠使用方式) 如果被佔用就使用 命令 kill殺死進程//SWOOLE_PROCESS 為多進程模式,一般這裡不傳值,預設為多進程 SWOOLE_BASE為基本模式 //SWOOLE_SOCK_TCP 也就是說建立tcp伺服器 $serv=new swoole_server('127.0.0.1','9501',SWOOLE_PROCESS,SWOOLE_SOCK_TCP);//伺服器設定參數$serv->set(['worker_num'=>4, //worker進程數 一般為cpu數的 1-4倍'max_request'=>10000, //worker進程在處理完n次請求後結束運行重建一個]);//這裡//當然還有很多設定的參數 文檔傳送門:https://wiki.swoole.com/wiki/page/13.html//監聽串連進入事件(這裡是一個閉包寫法)串連後調用的函數//$fd用戶端串連的唯一標示//$reactor_id 線程id 是一個自增數字,範圍是1 ~ 1600萬,fd超過1600萬後會自動從1開始進行複用$serv->on('connect', function ($serv, $fd, $reactor_id) { echo "Client: {$reactor_id} - {$fd}-Connect.\n";});//監聽資料接收事件//$data就是接收的資料$serv->on('receive', function ($serv, $fd, $reactor_id, $data)) { $serv->send($fd, "Server: ".$data); echo '收到了資料'.$data;});//監聽串連關閉事件$serv->on('close', function ($serv, $fd) { echo "Client: Close".$fd."\n";});//啟動伺服器$serv->start();
ok我們測試一下 php tcp.php 開啟tcp伺服器(如果連接埠被佔用,則殺死佔用連接埠的進程,關掉使用ctrl+c,掛起使用ctrl+z)
再開啟telnet(我們要再開啟一個終端)測試一下是不是成功了,隨便輸入eqqeq
再看看tcp伺服器
看到這裡我們整理一下思路:
建立了tcp伺服器->telnet串連伺服器->tcp執行connect->telnent發送資訊->tcp監聽到receive事件->telnent斷開->tcp 監聽到close事件
疑問
1.server與telnet的關係
伺服器與客服端的關係,一個server對應多個telnet
2.$serv->send($fd, "Server: ".$data); 和 直接輸出 echo 有什麼區別呀?
send是發送資料 給 對方(串連我伺服器的) ,比如你用和你的朋友聊天,你發了一個server: ".$data,那麼就相當於你把訊息發給了你朋友, 而echo的話是輸出內容,只給自己。
3.線程與進程是什麼鬼?
相當於一個工廠(CPU)裡的多個車間(進程)
一個車間(進程)有很多個工人(線程)
車間裡面有廁所(共用記憶體),工人都可以共用,但是你得等工人用完才可以進去
我們平時使用php是單進程,那麼大的工廠就用了一個車間效率當然慢,
所以我們要多個車間(多進程),多個員工(線程),來提高效率
注意:
每次修改伺服器指令碼檔案後都要
關閉進程再重新開啟才會生效
2.建立udp伺服器
1.TCP核ucp都是傳輸層協議,但是UDP伺服器與TCP伺服器不同,UDP沒有串連的概念,udp消耗資源比較小,但是速度快。啟動Server後,用戶端無需Connect,直接可以向Server監聽的9502連接埠發送資料包。
2.udp的建立方式跟tcp很像
//就是把最後一個參數改為 SWOOLE_SOCK_UDP $serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
3.UDP伺服器可以使用不用telnet而是用 netcat -u 來串連測試
nc安裝:
yum -y install yum -y install nc.x86_64 使用就是直接 nc -u 127.0.0.1 9502
4.完整的實現
//建立Server對象,監聽 127.0.0.1:9502連接埠,類型為SWOOLE_SOCK_UDP$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //udp沒有 $serv->on connect的概念//監聽資料接收事件$serv->on('Packet', function ($serv, $data, $clientInfo) { $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($clientInfo);});//啟動伺服器$serv->start();
5.測試,同樣我們也開啟2個終端
udp伺服器 這裡我們列印了$clientInfo
nc測試伺服器
ok測試沒有問題^-^
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!