目錄php
持續更新中。。。html
先照着文檔建立一個tcp服務器react
<?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)
segmentfault
再打開telnet(咱們要再打開一個終端)測試一下是否是成功了,隨便輸入eqqeq服務器
再看看tcp服務器微信
看到這裏咱們整理一下思路:
建立了tcp服務器->telnet鏈接服務器->tcp執行connect->telnent發送信息->tcp監聽到receive事件->telnent斷開->tcp 監聽到close事件swoole
疑問
1.server與telnet的關係
服務器與客服端的關係,一個server對應多個telnet閉包
2.$serv->send($fd, "Server: ".$data); 和 直接輸出 echo 有什麼區別呀?異步
send是發送數據 給 對方(鏈接我服務器的) ,好比你用微信和你的朋友聊天,你發了一個server: ".$data,那麼就至關於你把消息發給了你朋友, 而echo的話是輸出內容,只給本身。tcp
3.線程與進程是什麼鬼?
至關於一個工廠(CPU)裏的多個車間(進程)
一個車間(進程)有不少個工人(線程)
車間裏面有廁所(共享內存),工人均可以共用,可是你得等工人用完才能夠進去
咱們平時使用php是單進程,那麼大的工廠就用了一個車間效率固然慢,
因此咱們要多個車間(多進程),多個員工(線程),來提升效率
注意:
每次修改服務器腳本文件後都要
關閉進程再從新打開纔會生效
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測試沒有問題^-^
思考:tcp與udp都是傳輸層協議的server,那麼基於傳輸層的應用層server又會是怎樣的呢?
若是這篇文章對你有用,能夠點個贊或者是收藏,算是對做者的鼓勵~
文檔地址傳送門:https://wiki.swoole.com/wiki/...
推薦singwa老師的視頻教程:https://coding.imooc.com/clas...
另附上小弟網站。。。www.entercode.cn 推廣一波...