十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
那你可以在插入數(shù)據(jù)庫那里設(shè)置監(jiān)聽呀,一有插入就往Android推送消息。
平邑網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,平邑網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為平邑上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的平邑做網(wǎng)站的公司定做!
不然你只能通過每隔一段時(shí)間刷新一下讀取數(shù)據(jù)庫,看看有沒有更新,有就推送,沒有就繼續(xù)監(jiān)聽,這個(gè)你可以自己設(shè)置更新時(shí)間。
一、socket協(xié)議的簡介
WebSocket是什么,有什么優(yōu)點(diǎn)
WebSocket是一個(gè)持久化的協(xié)議,這是相對于http非持久化來說的。應(yīng)用層協(xié)議
舉個(gè)簡單的例子,http1.0的生命周期是以request作為界定的,也就是一個(gè)request,一個(gè)response,對于http來說,本次client與server的會(huì)話到此結(jié)束;而在http1.1中,稍微有所改進(jìn),即添加了keep-alive,也就是在一個(gè)http連接中可以進(jìn)行多個(gè)request請求和多個(gè)response接受操作。然而在實(shí)時(shí)通信中,并沒有多大的作用,http只能由client發(fā)起請求,server才能返回信息,即server不能主動(dòng)向client推送信息,無法滿足實(shí)時(shí)通信的要求。而WebSocket可以進(jìn)行持久化連接,即client只需進(jìn)行一次握手,成功后即可持續(xù)進(jìn)行數(shù)據(jù)通信,值得關(guān)注的是WebSocket實(shí)現(xiàn)client與server之間全雙工通信,即server端有數(shù)據(jù)更新時(shí)可以主動(dòng)推送給client端。
二、介紹client與server之間的socket連接原理
1、下面是一個(gè)演示client和server之間建立WebSocket連接時(shí)握手部分
2、client與server建立socket時(shí)握手的會(huì)話內(nèi)容,即request與response
a、client建立WebSocket時(shí)向服務(wù)器端請求的信息
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //告訴服務(wù)器現(xiàn)在發(fā)送的是WebSocket協(xié)議
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一個(gè)Base64 encode的值,這個(gè)是瀏覽器隨機(jī)生成的,用于驗(yàn)證服務(wù)器端返回?cái)?shù)據(jù)是否是WebSocket助理
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin:
b、服務(wù)器獲取到client請求的信息后,根據(jù)WebSocket協(xié)議對數(shù)據(jù)進(jìn)行處理并返回,其中要對Sec-WebSocket-Key進(jìn)行加密等操作
HTTP/1.1 101 Switching Protocols
Upgrade: websocket //依然是固定的,告訴客戶端即將升級(jí)的是Websocket協(xié)議,而不是mozillasocket,lurnarsocket或者shitsocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //這個(gè)則是經(jīng)過服務(wù)器確認(rèn),并且加密過后的 Sec-WebSocket-Key,也就是client要求建立WebSocket驗(yàn)證的憑證
Sec-WebSocket-Protocol: chat
3、socket建立連接原理圖:
三、PHP中建立websocket的過程講解
SocketService.php:
web.html:
百度云推送可以實(shí)現(xiàn)你這種需求,可以指定推給某個(gè)ID,也可以指定推給哪個(gè)組,還可以推給所有人我們用極光推送,客戶端和服務(wù)端配置的都簡單,有Demo可直接運(yùn)行的.
demo可以直接運(yùn)行的(有個(gè)main方法測試的)
不過,如果不是一定要實(shí)時(shí)消息,還是不要用這種第三方的推送服務(wù)器了,畢竟是人家的服務(wù)器
而且推送次數(shù),頻率什么的都有限制,還不如你在移動(dòng)端做輪詢處理,即1分鐘請求一下服務(wù)器,或者30秒請求一下服務(wù)器,看看有沒有數(shù)據(jù)什么的.
當(dāng)然也可以自己搭建推送服務(wù)器,xmpp協(xié)議什么的.好復(fù)雜
用極光推送你試試。
更多問題到問題求助專區(qū)()
數(shù)據(jù)庫實(shí)時(shí)推送數(shù)據(jù)方法:
1、新建一個(gè)名字為ApplyJiQiMa的數(shù)據(jù)庫。
2、往數(shù)據(jù)庫中先增加四條數(shù)據(jù),其ApplyDate當(dāng)前的時(shí)間戳,后面用于監(jiān)聽時(shí)的排序,方便可以讓數(shù)據(jù)庫實(shí)時(shí)推送。
有兩種實(shí)現(xiàn)方法:
1、你可以用PHP服務(wù)器推技術(shù),當(dāng)數(shù)據(jù)發(fā)生變化時(shí),主動(dòng)推送到頁面顯示。相關(guān)技術(shù)可以參考文檔。百度也很多。
2、你可以用Javascript,每過一秒鐘,使用Ajax獲取數(shù)據(jù),一秒鐘刷新一次,也可以實(shí)現(xiàn)的。
第一種我也不會(huì)。第二種相信你可以的。
while的話是循環(huán),你用了只會(huì)一行行加
使用以下代碼可以更改設(shè)置。
后端代碼
push.php
?php
use?Workerman\Worker;
require_once?'./Workerman/Autoloader.php';
$worker?=?new?Worker('websocket://0.0.0.0:1234');
//?這里進(jìn)程數(shù)必須設(shè)置為1
$worker-count?=?1;
//?worker進(jìn)程啟動(dòng)后建立一個(gè)內(nèi)部通訊端口
$worker-onWorkerStart?=?function($worker)
{
//?開啟一個(gè)內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式?文本+換行符????$inner_text_worker?=?new?Worker('Text://0.0.0.0:5678');
$inner_text_worker-onMessage?=?function($connection,?$buffer)
{
global?$worker;
//?$data數(shù)組格式,里面有uid,表示向那個(gè)uid的頁面推送數(shù)據(jù)
$data?=?json_decode($buffer,?true);
$uid?=?$data['uid'];
//?通過workerman,向uid的頁面推送數(shù)據(jù)
$ret?=?sendMessageByUid($uid,?$buffer);
//?返回推送結(jié)果
$connection-send($ret???'ok'?:?'fail');
};
$inner_text_worker-listen();
};
//?新增加一個(gè)屬性,用來保存uid到connection的映射
$worker-uidConnections?=?array();
//?當(dāng)有客戶端發(fā)來消息時(shí)執(zhí)行的回調(diào)函數(shù)$worker-onMessage?=?function($connection,?$data)use($worker)
{
//?判斷當(dāng)前客戶端是否已經(jīng)驗(yàn)證,既是否設(shè)置了uid
if(!isset($connection-uid))
{
//?沒驗(yàn)證的話把第一個(gè)包當(dāng)做uid(這里為了方便演示,沒做真正的驗(yàn)證)
$connection-uid?=?$data;
/*?保存uid到connection的映射,這樣可以方便的通過uid查找connection,
*?實(shí)現(xiàn)針對特定uid推送數(shù)據(jù)
*/
$worker-uidConnections[$connection-uid]?=?$connection;
return;
}
};
//?當(dāng)有客戶端連接斷開時(shí)
$worker-onClose?=?function($connection)use($worker)
{
global?$worker;
if(isset($connection-uid))
{
//?連接斷開時(shí)刪除映射
unset($worker-uidConnections[$connection-uid]);
}
};
//?向所有驗(yàn)證的用戶推送數(shù)據(jù)
function?broadcast($message)
{
global?$worker;
foreach($worker-uidConnections?as?$connection)
{
$connection-send($message);
}
}
//?針對uid推送數(shù)據(jù)
function?sendMessageByUid($uid,?$message)
{
global?$worker;
if(isset($worker-uidConnections[$uid]))
{
$connection?=?$worker-uidConnections[$uid];
$connection-send($message);
return?true;
}
return?false;
}
//?運(yùn)行所有的worker(其實(shí)當(dāng)前只定義了一個(gè))
Worker::runAll();
啟動(dòng)后端服務(wù)
php?push.php?start?-d
前端接收推送的js代碼
var?ws?=?new?WebSocket('ws://127.0.0.1:1234');
ws.onopen?=?function(){
var?uid?=?'uid1';
ws.send(uid);
};
ws.onmessage?=?function(e){
alert(e.data);
};后端推送消息的代碼
//?建立socket連接到內(nèi)部推送端口
$client?=?stream_socket_client('tcp://127.0.0.1:5678',?$errno,?$errmsg,?1,??STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
//?推送的數(shù)據(jù),包含uid字段,表示是給這個(gè)uid推送
$data?=?array('uid'='uid1',?'percent'='88%');
//?發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
fwrite($client,?json_encode($data)."\n");
//?讀取推送結(jié)果
echo?fread($client,?8192);這里的uid不一定是用戶的id,也可以理解為任務(wù)id即 taskid