Hướng dẫn php socket listen - ổ cắm php nghe

Tôi biết người đàn ông đấu tranh! Nhưng gần đây tôi đã làm việc khá nhiều với Workerman. Nếu bạn chưa vấp phải framework php này thì tốt hơn hết bạn nên kiểm tra điều này!

Vâng, Workerman là một khung công tác PHP hướng sự kiện không đồng bộ để dễ dàng xây dựng các ứng dụng mạng nhanh, có thể mở rộng. (Tôi vừa sao chép và dán nó từ trang web của họ hahahah http://www.workerman.net/en/ )

Cách dễ dàng để giải thích điều này là khi nói đến lập trình web socket, tất cả những gì bạn thực sự cần là có 2 tệp trong máy chủ của bạn hoặc máy chủ cục bộ (bất cứ nơi nào bạn đang làm việc).

  1. server.php (mã nguồn sẽ phản hồi tất cả các yêu cầu của khách hàng) (mã nguồn sẽ phản hồi tất cả các yêu cầu của khách hàng)

  2. client.php / client.html (mã nguồn sẽ thực hiện các nội dung yêu cầu) (mã nguồn sẽ thực hiện các nội dung yêu cầu)

Vì vậy, về cơ bản, bạn phải viết mã trước trên server.php và khởi động máy chủ. Thông thường, vì tôi đang sử dụng các cửa sổ làm tăng thêm nhiều khó khăn, tôi chạy máy chủ thông qua lệnh này -> php server.php startserver.php và khởi động máy chủ. Thông thường, vì tôi đang sử dụng các cửa sổ làm tăng thêm nhiều khó khăn, tôi chạy máy chủ thông qua lệnh này -> php server.php start

Vâng nếu bạn đang sử dụng xampp. Đây là một cách để làm điều đó. Đi đến bất cứ nơi nào bạn muốn để đặt các tệp của mình. Trong trường hợp của chúng tôi, chúng tôi sẽ đưa các tệp vào

C: /xampp/htdocs/websocket/server.php

C: /xampp/htdocs/websocket/client.php hoặc client.html

Giả sử rằng bạn đã có các tệp đó trong máy chủ cục bộ của mình. Mở Git Bash hoặc Dòng lệnh hoặc Thiết bị đầu cuối của bạn hoặc bất kỳ cái nào bạn đang sử dụng và tải xuống các thư viện php tại đây.

https://github.com/walkor/Workerman

https://github.com/walkor/phpsocket.io

Tôi thường tải xuống thông qua trình soạn nhạc và chỉ tự động tải các tệp đó trong các tập lệnh php của mình.

Và cũng kiểm tra cái này. Điều này thực sự quan trọng ! Bạn cần libary javascript này để client.php hoặc client.html giao tiếp với server.php khi bạn chạy nó.quan trọng ! Bạn cần libary javascript này để client.php hoặc client.html giao tiếp với server.php khi bạn chạy nó.

https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

Tôi chỉ sao chép và dán thư mục socket.io-client đó ở cùng cấp với server.php và client.php của tôi

Đây là mã nguồn server.phpserver.php

on('connection', function($socket)use($io){
    $socket->on('send message', function($msg)use($io){
        $io->emit('new message', $msg);
    });
});

Worker::runAll();

Và đây là client.php hoặc client.html sourcecodeclient.php hoặc client.html sourcecode



    
        Chat
        
                
    
    
        

Một lần nữa, hãy mở dòng lệnh của bạn hoặc git bash hoặc terminal nơi bạn đặt tệp server.php của mình. Vì vậy, trong trường hợp của chúng tôi, đó là C: / xampp / htdocs / websocket / và nhập vào bắt đầu php server.php và nhấn enter.bắt đầu php server.php và nhấn enter.

Sau đó, truy cập trình duyệt của bạn và nhập http: //localhost/websocket/client.php để truy cập trang web của bạn. Sau đó, chỉ cần nhập bất kỳ thứ gì vào hộp văn bản đó và bạn sẽ thấy một websocket php cơ bản khi đang di chuyển!http: //localhost/websocket/client.php để truy cập trang web của bạn. Sau đó, chỉ cần nhập bất kỳ thứ gì vào hộp văn bản đó và bạn sẽ thấy một websocket php cơ bản khi đang di chuyển!

Bạn chỉ cần nhớ. Trong lập trình web socket, nó chỉ cần một máy chủ và một máy khách. Chạy mã máy chủ trước và mở mã máy khách. Và bạn có nó rồi đấy! Hi vọng điêu nay co ich!

11 hữu ích 1 bình luận chia sẻ 1 bình luận chia sẻ

Có hướng dẫn hay hướng dẫn nào cho thấy cách tự viết một máy chủ websockets đơn giản trong PHP không? Tôi đã cố gắng tìm kiếm nó trên google nhưng tôi không tìm thấy nhiều. Tôi đã tìm thấy phpwebsockets nhưng hiện tại nó đã lỗi thời và không hỗ trợ giao thức mới nhất. Tôi đã cố cập nhật nó nhưng nó dường như không hoạt động. Tôi đã cố gắng tìm kiếm nó trên google nhưng tôi không tìm thấy nhiều. Tôi đã tìm thấy phpwebsockets nhưng hiện tại nó đã lỗi thời và không hỗ trợ giao thức mới nhất. Tôi đã cố cập nhật nó nhưng nó dường như không hoạt động.

#!/php -q
php  /*  >php -q server.php  */

error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();

$master  = WebSocket("localhost",12345);
$sockets = array($master);
$users   = array();
$debug   = false;

while(true){
  $changed = $sockets;
  socket_select($changed,$write=NULL,$except=NULL,NULL);
  foreach($changed as $socket){
    if($socket==$master){
      $client=socket_accept($master);
      if($client<0){ console("socket_accept() failed"); continue; }
      else{ connect($client); }
    }
    else{
      $bytes = @socket_recv($socket,$buffer,2048,0);
      if($bytes==0){ disconnect($socket); }
      else{
        $user = getuserbysocket($socket);
        if(!$user->handshake){ dohandshake($user,$buffer); }
        else{ process($user,$buffer); }
      }
    }
  }
}

//---------------------------------------------------------------
function process($user,$msg){
  $action = unwrap($msg);
  say("< ".$action);
  switch($action){
    case "hello" : send($user->socket,"hello human");                       break;
    case "hi"    : send($user->socket,"zup human");                         break;
    case "name"  : send($user->socket,"my name is Multivac, silly I know"); break;
    case "age"   : send($user->socket,"I am older than time itself");       break;
    case "date"  : send($user->socket,"today is ".date("Y.m.d"));           break;
    case "time"  : send($user->socket,"server time is ".date("H:i:s"));     break;
    case "thanks": send($user->socket,"you're welcome");                    break;
    case "bye"   : send($user->socket,"bye");                               break;
    default      : send($user->socket,$action." not understood");           break;
  }
}

function send($client,$msg){
  say("> ".$msg);
  $msg = wrap($msg);
  socket_write($client,$msg,strlen($msg));
}

function WebSocket($address,$port){
  $master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)     or die("socket_create() failed");
  socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)  or die("socket_option() failed");
  socket_bind($master, $address, $port)                    or die("socket_bind() failed");
  socket_listen($master,20)                                or die("socket_listen() failed");
  echo "Server Started : ".date('Y-m-d H:i:s')."\n";
  echo "Master socket  : ".$master."\n";
  echo "Listening on   : ".$address." port ".$port."\n\n";
  return $master;
}

function connect($socket){
  global $sockets,$users;
  $user = new User();
  $user->id = uniqid();
  $user->socket = $socket;
  array_push($users,$user);
  array_push($sockets,$socket);
  console($socket." CONNECTED!");
}

function disconnect($socket){
  global $sockets,$users;
  $found=null;
  $n=count($users);
  for($i=0;$i<$n;$i++){
    if($users[$i]->socket==$socket){ $found=$i; break; }
  }
  if(!is_null($found)){ array_splice($users,$found,1); }
  $index = array_search($socket,$sockets);
  socket_close($socket);
  console($socket." DISCONNECTED!");
  if($index>=0){ array_splice($sockets,$index,1); }
}

function dohandshake($user,$buffer){
  console("\nRequesting handshake...");
  console($buffer);
  //list($resource,$host,$origin,$strkey1,$strkey2,$data) 
  list($resource,$host,$u,$c,$key,$protocol,$version,$origin,$data) = getheaders($buffer);
  console("Handshaking...");

    $acceptkey = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));
  $upgrade  = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $acceptkey\r\n";

  socket_write($user->socket,$upgrade,strlen($upgrade));
  $user->handshake=true;
  console($upgrade);
  console("Done handshaking...");
  return true;
}

function getheaders($req){
    $r=$h=$u=$c=$key=$protocol=$version=$o=$data=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("/Upgrade: (.*)\r\n/",$req,$match)){ $u=$match[1]; }
    if(preg_match("/Connection: (.*)\r\n/",$req,$match)){ $c=$match[1]; }
    if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }
    if(preg_match("/Sec-WebSocket-Protocol: (.*)\r\n/",$req,$match)){ $protocol=$match[1]; }
    if(preg_match("/Sec-WebSocket-Version: (.*)\r\n/",$req,$match)){ $version=$match[1]; }
    if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
    if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
    return array($r,$h,$u,$c,$key,$protocol,$version,$o,$data);
}

function getuserbysocket($socket){
  global $users;
  $found=null;
  foreach($users as $user){
    if($user->socket==$socket){ $found=$user; break; }
  }
  return $found;
}

function     say($msg=""){ echo $msg."\n"; }
function    wrap($msg=""){ return chr(0).$msg.chr(255); }
function  unwrap($msg=""){ return substr($msg,1,strlen($msg)-2); }
function console($msg=""){ global $debug; if($debug){ echo $msg."\n"; } }

class User{
  var $id;
  var $socket;
  var $handshake;
}

?>

và khách hàng:

var connection = new WebSocket('ws://localhost:12345');
connection.onopen = function () {
  connection.send('Ping'); // Send the message 'Ping' to the server
};

// Log errors
connection.onerror = function (error) {
  console.log('WebSocket Error ' + error);
};

// Log messages from the server
connection.onmessage = function (e) {
  console.log('Server: ' + e.data);
};

Nếu có bất cứ điều gì sai trong mã của tôi, bạn có thể giúp tôi sửa nó không? Concole trong firefox nóiFirefox can't establish a connection to the server at ws://localhost:12345/.Concole trong firefox nóiFirefox can't establish a connection to the server at ws://localhost:12345/.

EDIT Vì có nhiều hứng thú với câu hỏi này, tôi quyết định cung cấp cho bạn những gì cuối cùng tôi đã đưa ra. Đây là mã đầy đủ của tôi.
Vì có nhiều hứng thú với câu hỏi này, tôi quyết định cung cấp cho bạn những gì cuối cùng tôi đã đưa ra. Đây là mã đầy đủ của tôi.

68 hữu ích 2 bình luận 131k xem chia sẻ 2 bình luận 131k xem chia sẻ