這是回調(diào)onConnect代碼
---------這是配置代碼------------
$gateway = new Gateway("websocket://0.0.0.0:8331");
$gateway->name = 'YourAppGateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會使用4000 4001 4002 4003 4個端口作為內(nèi)部通訊端口
$gateway->startPort = 2900;
// 服務(wù)注冊地址
$gateway->registerAddress = '127.0.0.1:1238';
// 心跳間隔
//$gateway->pingInterval = 10;
// 心跳數(shù)據(jù)
//$gateway->pingData = '{"type":"ping"}';
/*
// 當客戶端連接上來時,設(shè)置連接的onWebSocketConnect,即在websocket握手時的回調(diào)
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
// 可以在這里判斷連接來源是否合法,不合法就關(guān)掉連接
// $_SERVER標識來自哪個站點的頁面發(fā)起的websocket鏈接
if($_SERVER != 'http://kedou.workerman.net')
{
$connection->close();
}
// onWebSocketConnect 里面$_GET $_SERVER是可用的
// var_dump($_GET, $_SERVER);
};
};
*/
/*$gateway->onConnect = function($connection)
{
$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
}; */
// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
------前端代碼--------
當我在前端控制臺輸出ws的時候會出現(xiàn)這種情況
1、console.log(ws) 輸出是正常的,第一個紅框 readyState: 0 代表的是websocket初始化時未連接狀態(tài),第二個紅框readyState: 1代表 websocket 狀態(tài)已經(jīng)發(fā)生改變,即已經(jīng)和服務(wù)端成功建立連接。
2、代碼看上去也沒有發(fā)現(xiàn)有什么異常,同樣的代碼,我運行了一遍,工作OK。
3、更改了Events.php? 記得重啟~~
更改了Events.php 重啟了 但是有時候就是刷新頁面的時候 連接建立起來之后沒有觸發(fā)onConnect回調(diào)函數(shù) 偶爾會出現(xiàn)這種情況
我覺得可能是就是說如果瀏覽器不關(guān)閉的話 那么在刷新頁面的時候連接也不會斷開 所以沒有觸發(fā)onConnect回調(diào),會有這個可能嗎?
@5202: 在瀏覽器不關(guān)閉的場景下:若刷新頁面會重新建立連接;若不刷新頁面,連接也可能會斷開,因為防火墻會干掉一定時間內(nèi)不活躍的連接,所以長連接應(yīng)用必須加心跳。
@614:好的 多謝大佬 就是在本地環(huán)境會出現(xiàn)這種情況 然后我必須重啟websocket 然后刷新頁面 才可以解決,在線上偶爾會出現(xiàn)這種問題 一直找不到原因。
呃 我是把一個建立了連接的頁面一直放著然后有個js定時器一直給websocket發(fā)送消息,接著我把建立了連接的頁面放了一段時間之后,我就按F5刷新了一下頁面 這時候就觸發(fā)不了onConnect回調(diào)了
@614:我目前找到的問題好像是客戶端在連接服務(wù)器的時候連接沒有建立成功或者說沒連接上才會出現(xiàn)這種情況,但是現(xiàn)在就是找不到為啥有時候會出現(xiàn)看客戶端連接服務(wù)器的時候 連接建立不成功呢?
我在想會不會是緩存問題?如果說頁面做了緩存 第一次訪問的時候沒有緩存所以連接建立成功 但是第二次刷新頁面的時候訪問的時候有了緩存從而連接建立不成功 這時候頁面也不報錯?
@614:我用的是谷歌瀏覽器 開啟無痕模式進行訪問了 然后js是直接寫了個<script type="text/javascript"></script>標簽里面寫接著定義幾個函數(shù) 然后就
ws = new WebSocket("wss://"+document.domain+"/wss");
console.log(ws);
// 服務(wù)端主動推送消息時會觸發(fā)這里的onmessage
ws.onmessage = function(e){
var data = JSON.parse(e.data);
console.log(data);
}
@614:這時候我查看長連接返回的狀態(tài)是101沒問題但是既不觸發(fā)onConnect回調(diào)函數(shù) 然后我再控制臺打印輸出了一下ws.readyState卻發(fā)現(xiàn)值為0
這分別是我連接上和連接不上在控制臺查看ws的截圖:
連接上觸發(fā)onConnect回調(diào):
[attach]1599[/attach]
?
?
連接不上未觸發(fā)onConnect回調(diào)還有http狀態(tài)碼:
[attach]1598[/attach]
[attach]1597[/attach]
?
1、ws.readyState是在onXXX回調(diào)之外打印的吧? 如果是的話,ws.readyState = 0 就沒疑問了;換句話在onXXX回調(diào)中打印,應(yīng)該已經(jīng)是 ws.readyState = 1。
2、根據(jù)http響應(yīng)狀態(tài)碼101,也能充分說明 websocket 已經(jīng)成功建立連接,也就說明tcp的三次握手也早已成功了,而服務(wù)端的onConnect 是三次握手成功后觸發(fā)的。
明白了 就是我再刷新頁面的時候連接并沒有斷開 所以才會出現(xiàn)這種情況是嗎?但是有點不清楚的地方就是說 為什么連接會在有時候刷新頁面的時候不斷開呢?