導航:首頁 > 編程語言 > phpwebsocket二進制

phpwebsocket二進制

發布時間:2022-05-30 18:08:58

『壹』 php websocket 線上怎麼鏈接

在連接之前需要知道一下幾點: 1、了解websocket的協議和請求規范;2、使用PHP的socket函數庫來處理websocket的請求;3、處理websocket的數據鄭下面是我寫的一個小例子,裡面的注釋我覺得也挺詳細的了,對幀的處理我沒有完善

『貳』 php websocket相關問題

php不是直接用php.exe打開就行的,需要搭建php運行環境的,建議使用wamp,直接安裝後就給你搭建好了,然後再通過 localhost/index.php 打開就可以了,可以網路一下wamp使用教程

『叄』 php如何實現websocket

php有可用的websocket庫,不需要php-fpm。

目前比較成熟的有swoole(swoole.com),和workman(workman.net)

swoole是c寫的php擴展, 效率比nodejs還要高,workman是純php實現,兩者都號稱可以實現並發百萬TCP連接。

給你個例子:

這個要通過cmd運行的具體帶的參數有點忘記了
<?php
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();

//創建一個socket連接設置參數綁定監聽並且返回
$master=WebSocket("localhost",12345);

//標示是否已經進行過握手了
$is_shaked=false;

//是否已經關閉
$is_closed=true;

//將socket變為一個可用的socket

while(true){
//如果是關閉狀態並且是沒有握手的話則創建一個可用的socket(貌似第二個條件可以去除)
if($is_closed&&!$is_shaked){
if(($sock=socket_accept($master))<0){
echo"socket_accept()failed:reason:".socket_strerror($sock)." ";
}

//將關閉狀態修改為false
$is_closed=false;
}

//開始進行數據處理
process($sock);
}

//處理請求的函數
functionprocess($socket){
//先從獲取到全局變數
global$is_closed,$is_shaked;

//從socket中獲取數據
$buffer=socket_read($socket,2048);

//如果buffer返回值為false並且已經握手的話則斷開連接
if(!$buffer&&$is_shaked){
disconnect($socket);
}else{
//如果沒有握手的話則握手並且修改握手狀態
if($is_shaked==false){
$return_str=dohandshake($buffer);
$is_shaked=true;
}else{
//如果已經握手的話則送入deal函數中進行相應處理
$data_str=decode($buffer);//解析出來的從前端送來的內容
console($data_str);
$return_str=encode(deal($socket,$data_str));
//$return_str=encode($data_str);
}

//將應該返回的字元串寫入socket返回
socket_write($socket,$return_str,strlen($return_str));
}
}

functiondeal($socket,$msgObj){
$obj=json_decode($msgObj);
foreach($objas$key=>$value){
if($key=='close'){
disconnect($socket);
console('closesuccess');
return'closesuccess';
}elseif($key=='msg'){
console($value." ");
return$value;
}
}
}

//獲取頭部信息
functiongetheaders($req){
$r=$h=$o=null;
if(preg_match("/GET(.*)HTTP/",$req,$match)){$r=$match[1];}
if(preg_match("/Host:(.*) /",$req,$match)){$h=$match[1];}
if(preg_match("/Origin:(.*) /",$req,$match)){$o=$match[1];}
if(preg_match("/Sec-WebSocket-Key:(.*) /",$req,$match)){$key=$match[1];}
if(preg_match("/ (.*?)$/",$req,$match)){$data=$match[1];}
returnarray($r,$h,$o,$key,$data);
}

functionWebSocket($address,$port){
$master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)ordie("socket_create()failed");
socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1)ordie("socket_option()failed");
socket_bind($master,$address,$port)ordie("socket_bind()failed");
socket_listen($master,20)ordie("socket_listen()failed");
echo"ServerStarted:".date('Y-m-dH:i:s')." ";
echo"Mastersocket:".$master." ";
echo"Listeningon:".$address."port".$port." ";
return$master;
}

functiondohandshake($buffer){
list($resource,$host,$origin,$key,$data)=getheaders($buffer);
echo"resourceis$resource ";
echo"originis$origin ";
echo"hostis$host ";
echo"keyis$key ";

$response_key=base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));

$return_str="HTTP/1.1101SwitchingProtocols ".
"Upgrade:websocket ".
"Connection:Upgrade ".
"Sec-WebSocket-Accept:$response_key ";
return$return_str;
}

functionconsole($msg){
$msg=transToGBK($msg);
echo"$msg ";
return$msg;
}

functiondecode($msg=""){
$mask=array();
$data="";
$msg=unpack("H*",$msg);

$head=substr($msg[1],0,2);

if(hexdec($head{1})===8){
$data=false;
}elseif(hexdec($head{1})===1){
$mask[]=hexdec(substr($msg[1],4,2));
$mask[]=hexdec(substr($msg[1],6,2));
$mask[]=hexdec(substr($msg[1],8,2));
$mask[]=hexdec(substr($msg[1],10,2));

$s=12;
$e=strlen($msg[1])-2;
$n=0;
for($i=$s;$i<=$e;$i+=2){
$data.=chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
$n++;
}
}

return$data;
}

functionencode($msg=""){
$frame=array();
$frame[0]="81";
$msg.='isok';
$len=strlen($msg);
$frame[1]=$len<16?"0".dechex($len):dechex($len);
$frame[2]=ord_hex($msg);
$data=implode("",$frame);
returnpack("H*",$data);
}


functiontransToGBK($s){//UTF8->GBK
//echo$s;
returniconv("UTF-8","GBK",$s);
return$s;
}

functionord_hex($data){
$msg="";
$l=strlen($data);

for($i=0;$i<$l;$i++){
//ord是返回字元串第一個字元的ascii值
//dechex把十進制轉換為十六進制
$msg.=dechex(ord($data{$i}));
}

return$msg;
}

functiondisconnect($socket){
global$is_shaked,$is_closed;
$is_shaked=false;
$is_closed=true;
socket_close($socket);
}
?>

『肆』 執行命令PHP websocket.php出錯求解決

php websocket連接報錯一般是握手連接失敗導致。 php 用websocket,從連接、建立、綁定、監聽等,這些都需要手動去操作。配置錯誤會導致無法連接。 1、PHP 中處理 WEBSOCKET 2、提取 SEC-WEBSOCKET-KEY 信息 3、加密 SEC-WEBSOCKET-KEY 以上任何一個環節出錯都會導致失敗。你可以試試去後盾人在線學習平台,有很多的視頻教學,邊看邊學習,都是一線講師親自錄制的視頻,你可以去看看。

『伍』 php Websocket問題

連接已重置,當前請求被重定向到了另外一個地址,看network返回的header信息來分析

『陸』 如何用php實現websocket

html5自帶有websocket,這是客戶端的。
php可以使用swoole框架來實現websocket。
或則自己解析websocket協議,使用php自帶的socket。

友情提示:在以上情況的時候,php是運行在cli模式下的,這樣才能讓程序常駐內存。

『柒』 php websocket連接報錯怎麼解決

php websocket連接報錯一般是握手連接失敗導致。
php 用websocket,從連接、建立、綁定、監聽等,這些都需要手動去操作。配置錯誤會導致無法連接。
1、PHP 中處理 WEBSOCKET
2、提取 SEC-WEBSOCKET-KEY 信息
3、加密 SEC-WEBSOCKET-KEY
以上任何一個環節出錯都會導致失敗。
你可以試試去後盾人在線學習平台,有很多的視頻教學,邊看邊學習,都是一線講師親自錄制的視頻,你可以去看看。

『捌』 如何使用WebSocket

引擎支持最新的WebSocket Version 13。
在C++中使用
詳細代碼可參考引擎目錄下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。
頭文件中的准備工作
首先需要include WebSocket的頭文件。
#include "network/WebSocket.h"
cocos2d::network::WebSocket::Delegate定義了使用WebScocket需要監聽的回調通知介面。使用WebSocket的類,需要public繼承這個Delegate。
class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate
並Override下面的4個介面:
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
後面我們再詳細介紹每個回調介面的含義。
新建WebSocket並初始化
WebSocket.org 提供了一個專門用來測試WebSocket的伺服器"ws://echo.websocket.org"。 測試代碼以鏈接這個伺服器為例,展示如何在Cocos2d-x中使用WebSocket。
新建一個WebSocket:
cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();
init第一個參數是delegate,設置為this,第二個參數是伺服器地址。 URL中的"ws://"標識是WebSocket協議,加密的WebSocket為"wss://".
_wsiSendText->init(*this, "ws://echo.websocket.org")
WebSocket消息監聽
在調用send發送消息之前,先來看下4個消息回調。
onOpen
init會觸發WebSocket鏈接伺服器,如果成功,WebSocket就會調用onOpen,告訴調用者,客戶端到伺服器的通訊鏈路已經成功建立,可以收發消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::WebSocket::Data對象存儲客戶端接收到的數據, isBinary屬性用來判斷數據是二進制還是文本,len說明數據長度,bytes指向數據。
void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data)
{
if (!data.isBinary)
{
_sendTextTimes++;
char times[100] = {0};
sprintf(times, "%d", _sendTextTimes);
std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;
log("%s", textStr.c_str());

_sendTextStatus->setString(textStr.c_str());
}
}
onClose
不管是伺服器主動還是被動關閉了WebSocket,客戶端將收到這個請求後,需要釋放WebSocket內存,並養成良好的習慣:置空指針。
void WebSocketTestLayer::onClose(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_wsiSendText = NULL;
}
CC_SAFE_DELETE(ws);
}
onError
客戶端發送的請求,如果發生錯誤,就會收到onError消息,游戲針對不同的錯誤碼,做出相應的處理。
void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error)
{
log("Error was fired, error code: %d", error);
if (ws == _wsiSendText)
{
char buf[100] = {0};
sprintf(buf, "an error was fired, code: %d", error);
_sendTextStatus->setString(buf);
}
}
send消息到伺服器
在init之後,我們就可以調用send介面,往伺服器發送數據請求。send有文本和二進制兩中模式。
發送文本
_wsiSendText->send("Hello WebSocket, I'm a text message.");
發送二進制數據(多了一個len參數)
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));
主動關閉WebSocket
這是讓整個流程變得完整的關鍵步驟, 當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接。close會觸發onClose消息,而後onClose裡面,我們釋放內存。
_wsiSendText->close();
在Lua中使用
詳細代碼可參考引擎目錄下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。
創建WebSocket對象
腳本介面相對C++要簡單很多,沒有頭文件,創建WebSocket對象使用下面的一行代碼搞定。 參數是伺服器地址。
wsSendText = WebSocket:create("ws://echo.websocket.org")
定義並注冊消息回調函數
回調函數是普通的Lua function,4個消息回調和c++的用途一致,參考上面的說明。
local function wsSendTextOpen(strData)
sendTextStatus:setString("Send Text WS was opened.")
end

local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end

local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end

local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注冊不同於C++的繼承 & Override,有單獨的介面registerScriptHandler。 registerScriptHandler第一個參數是回調函數名,第二個參數是回調類型。 每一個WebSocket實例都需要綁定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
Lua中發送不區分文本或二進制模式,均使用下面的介面。
wsSendText:sendString("Hello WebSocket中文, I'm a text message.")
主動關閉WebSocket
當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接,以釋放伺服器和客戶端的資源。close會觸發cc.WEBSOCKET_CLOSE消息。
wsSendText:close()
在JSB中使用
詳細代碼可參考引擎目錄下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。
創建WebSocket對象
腳本介面相對C++要簡單很多,沒有頭文件,創建WebSocket對象使用下面的一行代碼搞定。 參數是伺服器地址。
this._wsiSendText = new WebSocket("ws://echo.websocket.org");
設置消息回調函數
JSB中的回調函數是WebSocket實例的屬性,使用匿名函數直接賦值給對應屬性。可以看出JS語言的特性,讓綁定回調函數更加優美。四個回調的含義,參考上面c++的描述。
this._wsiSendText.onopen = function(evt) {
self._sendTextStatus.setString("Send Text WS was opened.");
};

this._wsiSendText.onmessage = function(evt) {
self._sendTextTimes++;
var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;
cc.log(textStr);

self._sendTextStatus.setString(textStr);
};

this._wsiSendText.onerror = function(evt) {
cc.log("sendText Error was fired");
};

this._wsiSendText.onclose = function(evt) {
cc.log("_wsiSendText websocket instance closed.");
self._wsiSendText = null;
};
send消息
發送文本,無需轉換,代碼如下:
this._wsiSendText.send("Hello WebSocket中文, I'm a text message.");
發送二進制,測試代碼中,使用_stringConvertToArray函數來轉換string為二進制數據,模擬二進制的發送。 new Uint16Array創建一個16位無符號整數值的類型化數組,內容將初始化為0。然後,循環讀取字元串的每一個字元的Unicode編碼,並存入Uint16Array,最終得到一個二進制對象。
_stringConvertToArray:function (strData) {
if (!strData)
returnnull;

var arrData = new Uint16Array(strData.length);
for (var i = 0; i < strData.length; i++) {
arrData[i] = strData.charCodeAt(i);
}
return arrData;
},
send二進制介面和send文本沒有區別,區別在於傳入的對象,JS內部自己知道對象是文本還是二進制數據,然後做不同的處理。
var buf = "Hello WebSocket中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);

this._wsiSendBinary.send(binary.buffer);
主動關閉WebSocket
當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接,以釋放伺服器和客戶端的資源。close會觸發onclose消息。
onExit: function() {

if (this._wsiSendText)

this._wsiSendText.close();

}

『玖』 websocket與phpwebsocket

根據你的報錯,應該是php中沒有載入socket模塊,需要修改php.ini中
;extension=php_sockets.dll
將前面的分號去掉,再重啟web伺服器。

另外還要注意的是:google上面那個phpwebsocket已經過時了,它用的是76測試版的協議,握手時使用Sec-WebSocket-key1和Sec-WebSocket-key2加密與解密。

目前最新的是websocket13版協議,它在握手時使用的是Sec-WebSocket-Key

在請求中的「Sec-WebSocket-Key」是隨機的,伺服器端會用這些數據來構造出一個SHA-1的信息摘要。
把「Sec-WebSocket-Key」加上一個魔幻字元串「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」。使用 SHA-1 加密,之後進行 BASE-64編碼,將結果做為 「Sec-WebSocket-Accept」 頭的值,返回給客戶端。

實際上現在大多數瀏覽器都支持的是13版的協議,例如Chrome從14版開始就支持它了(之前都是支持76版)
要不就用chrome14版以前的瀏覽器,要不就看看websocket13版的協議,參照修改握手部分的代碼。

參考資料,zh.wikipedia.org/wiki/WebSocket

『拾』 請教php如何實現傳輸二進制位元組流到MTK客戶

MTK是啥?
傳輸二進制位元組流,可以考慮用websocket。

閱讀全文

與phpwebsocket二進制相關的資料

熱點內容
加密媒體怎麼輸密碼 瀏覽:161
方舟如何刪除伺服器數據 瀏覽:600
用閱讀app怎麼看18 瀏覽:689
gn文件編譯 瀏覽:783
酷閃加密系統 瀏覽:820
區塊鏈數據加密 瀏覽:389
3d命令集 瀏覽:289
單片機的智能產品工廠里有 瀏覽:300
事業單位程序員有必要去嗎 瀏覽:583
人工智慧訓練小鳥python 瀏覽:132
怎樣把兩個pdf合並成一個 瀏覽:681
什麼app帶仿製圖章 瀏覽:420
單片機CJNE什麼意思 瀏覽:569
廊坊伺服器是什麼 瀏覽:763
客戶解壓要打欠條還是收據 瀏覽:774
通過app組件啟動有什麼壞處 瀏覽:775
不屬於國產密碼演算法 瀏覽:861
單片機LED顯示字型檔 瀏覽:353
日本文件夾品牌十大名牌 瀏覽:397
靜脈壓縮襪和打底褲的區別 瀏覽:345