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($

我是websocket的新手。 我在PHP上实现了一个简单的websocket。握手工作正常,而且连接肯定是打开的,因为我的服务器可以从客户端获取消息

但是,一旦我尝试将消息发送回客户机,客户机根本不会响应

下面是屏蔽消息并将其发送回客户端的代码

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;
}