目前在做一個(gè)物聯(lián)網(wǎng)系統(tǒng),demo的Gateway用來(lái)做設(shè)備的tcp連接,
$gateway = new Gateway("tcp://0.0.0.0:8282");
$gateway->startPort = 2900;
又新建了一個(gè)websocket的Gateway用來(lái)做網(wǎng)頁(yè)的連接
$gateway = new Gateway("websocket://0.0.0.0:1234");
$gateway->startPort = 3000;
然后用網(wǎng)頁(yè)連接了websocket端口,用tcp測(cè)試工具連接了tcp端口,當(dāng)其中一個(gè)終端發(fā)消息時(shí)其他終端都可以收到消息,這是沒(méi)問(wèn)題的,但是tcp端發(fā)送消息后會(huì)把websocket端口所有用戶踢掉線,試了幾次都是如此。
目前是測(cè)試domo,基本上沒(méi)有太多的改動(dòng),所以不是代碼的問(wèn)題,這究竟是為什么?
測(cè)試環(huán)境windows10 64位
暫時(shí)沒(méi)找到同樣的問(wèn)題。
懷疑是 websocket 接收到消息了, 處理過(guò)程報(bào)錯(cuò), 導(dǎo)致掉線了
網(wǎng)頁(yè)端沒(méi)有收到消息,直接掉線,代碼還是下載的demo,啥也沒(méi)改
/**
* 當(dāng)客戶端連接時(shí)觸發(fā)
* 如果業(yè)務(wù)不需此回調(diào)可以刪除onConnect
*
* @param int $client_id 連接id
*/
public static function onConnect($client_id)
{
// 向當(dāng)前client_id發(fā)送數(shù)據(jù)
Gateway::sendToClient($client_id, "Hello $client_id\r\n");
// 向所有人發(fā)送
Gateway::sendToAll("$client_id login\r\n");
}
/**
* 當(dāng)客戶端發(fā)來(lái)消息時(shí)觸發(fā)
* @param int $client_id 連接id
* @param mixed $message 具體消息
*/
public static function onMessage($client_id, $message)
{
// 向所有人發(fā)送
Gateway::sendToAll("$client_id said $message\r\n");
}
/**
* 當(dāng)用戶斷開(kāi)連接時(shí)觸發(fā)
* @param int $client_id 連接id
*/
public static function onClose($client_id)
{
// 向所有人發(fā)送
GateWay::sendToAll("$client_id logout\r\n");
}
<?php
/**
* websocket 請(qǐng)求網(wǎng)關(guān)
*/
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
// 自動(dòng)加載類(lèi)
require_once __DIR__ . '/../../vendor/autoload.php';
// gateway 進(jìn)程,這里使用Text協(xié)議,可以用telnet測(cè)試
$gateway = new Gateway("websocket://0.0.0.0:1234");
// gateway名稱,status方便查看
$gateway->name = 'websocketGateway';
// gateway進(jìn)程數(shù)
$gateway->count = 4;
// 本機(jī)ip,分布式部署時(shí)使用內(nèi)網(wǎng)ip
$gateway->lanIp = '127.0.0.1';
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會(huì)使用4000 4001 4002 4003 4個(gè)端口作為內(nèi)部通訊端口
$gateway->startPort = 3000;
// 服務(wù)注冊(cè)地址
$gateway->registerAddress = '127.0.0.1:1238';
// 心跳間隔
// $gateway->pingInterval = 40;
// 連續(xù)幾次沒(méi)有心跳則斷開(kāi)連接
// $gateway->pingNotResponseLimit = 1;
// 如果不是在根目錄啟動(dòng),則運(yùn)行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
因?yàn)榭吹絹y碼了,可能編碼問(wèn)題。websocket通訊必須是utf8編碼,你的這個(gè)tcp客戶端發(fā)的消息可能不是utf8編碼。
好的,感謝,經(jīng)過(guò)測(cè)試確實(shí)是編碼問(wèn)題,如果發(fā)送數(shù)字和字母不會(huì)出現(xiàn)掉線情況,這是個(gè)TCP測(cè)試工具帶來(lái)的問(wèn)題