Php WebSocket:客户端不响应服务器
我是websocket的新手。 我在PHP上实现了一个简单的websocket。握手工作正常,而且连接肯定是打开的,因为我的服务器可以从客户端获取消息 但是,一旦我尝试将消息发送回客户机,客户机根本不会响应 下面是屏蔽消息并将其发送回客户端的代码Php WebSocket:客户端不响应服务器,php,websocket,Php,Websocket,我是websocket的新手。 我在PHP上实现了一个简单的websocket。握手工作正常,而且连接肯定是打开的,因为我的服务器可以从客户端获取消息 但是,一旦我尝试将消息发送回客户机,客户机根本不会响应 下面是屏蔽消息并将其发送回客户端的代码 function myProcess($user,$buffer) { //$buffer=unwrap($buffer); console("Request Caught."); console("Content Length: ".strlen($
function myProcess($user,$buffer)
{
//$buffer=unwrap($buffer);
console("Request Caught.");
console("Content Length: ".strlen($buffer));
console("Content: ".unmask($buffer));
console("First 8 bits: ".ord($buffer[0]));
console("Opcode: ".opcode($buffer,true));
//console("Full Text: ".$buffer);
//socket_write($user->socket,mask(unmask($buffer)));
console("Masking: ");
$tmp=unmask($buffer);
console($tmp);
$masked=mask($tmp);
opcode($masked);
for($i=0;$i<strlen($masked);$i++)
{
console($i.": ".ord($masked[$i]));
}
console("length: ".strlen($masked));
console("Sending Response: ");
console(socket_write($user->socket,$masked,strlen($masked)));
}
function mask($text)
{
$first8bit=0x81;
$header;
console("mask: payload length:".strlen($text));
if(strlen($text)<=125)
{
$header=pack("CC",$first8bit,strlen($text));
}
else if(strlen($text)<65536)
{
$header=pack("CCS",$first8bit,126,strlen($text));
}
else
{
$header=pack("CCN",$first8bit,127,strlen($text));
}
return $header.$text;
}
这会影响握手:
function dohandshake($user,$buffer){
console("\nRequesting handshake...");
console($buffer);
list($resource,$host,$origin,$strkey,$data) = getheaders($buffer);
console("Handshaking...");
$upgrade="HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: ".calc_accept($strkey)."\r\n\r\n";
socket_write($user->socket,$upgrade.chr(0),strlen($upgrade.chr(0)));
$user->handshake=true;
console($upgrade);
console("Done handshaking...");
return true;
}
这2个函数通过套接字获得客户端的握手和用户对象:
function getheaders($req){
$r=$h=$o=null;
if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; }
if(preg_match("/Host: (.*)\r\n/" ,$req,$match)){ $h=$match[1]; }
if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }
if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
return array($r,$h,$o,$key,$data);
}
function getuserbysocket($socket){
global $users;
$found=null;
foreach($users as $user){
if($user->socket==$socket){ $found=$user; break; }
}
return $found;
}
对于126到65536字节之间的消息,
pack
的格式字符串看起来是错误的。你能试着换衣服吗
“CCS”-无符号短(始终为16位,机器字节顺序)
到
“CCn”-“网络”(大端)顺序的无符号短(16位)
我解决了
对于在这个奇怪问题上苦苦挣扎的人来说,这就是答案:
从握手函数中删除socket_write($user->socket,$upgrade.chr(0)、strlen($upgrade.chr(0))的chr(0)
我仍然会把西姆诺克的答案标记为正确答案,因为他启发了我。谢谢您确定正在使用正确的套接字向客户端写入信息吗?向客户端发送消息将套接字与接收消息分开。是的,我接受新传入的套接字并将其保存到用户对象以供以后使用。我认为发送较长字符串时在客户端上给出错误表明客户端获得字节。我已经更改了它,但这没有帮助…并且“hi”的长度为2,肯定是if语句>125&&我想你的问题是发送“hi”有效,但发送(未指定)较长消息失败?发送“hi”是否也失败?我的情况是,将“hi”发送回客户端,客户端不会给出任何响应,从服务器发送“hi”,客户端将给出错误:未定义。更具体地说,发送任何小于6字节的帧,客户端将不会响应,但发送任何大于6字节的帧,客户端将给出错误消息。谢谢,我理解。您确定没有从问题中未包含的任何代码发送任何数据吗?在握手结束时说出其他数据。这可能是值得张贴更多的代码来仔细检查这一点。嗨,我已经张贴了几乎所有的代码在这篇文章。我对这个奇怪的问题很生气。如果可以,请帮忙,非常感谢!!
function dohandshake($user,$buffer){
console("\nRequesting handshake...");
console($buffer);
list($resource,$host,$origin,$strkey,$data) = getheaders($buffer);
console("Handshaking...");
$upgrade="HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: ".calc_accept($strkey)."\r\n\r\n";
socket_write($user->socket,$upgrade.chr(0),strlen($upgrade.chr(0)));
$user->handshake=true;
console($upgrade);
console("Done handshaking...");
return true;
}
function getheaders($req){
$r=$h=$o=null;
if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; }
if(preg_match("/Host: (.*)\r\n/" ,$req,$match)){ $h=$match[1]; }
if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }
if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
return array($r,$h,$o,$key,$data);
}
function getuserbysocket($socket){
global $users;
$found=null;
foreach($users as $user){
if($user->socket==$socket){ $found=$user; break; }
}
return $found;
}