Hướng dẫn php socket buffer size - kích thước bộ đệm ổ cắm php

Vì vậy, đây thực sự là một câu hỏi hai phần với phần đầu tiên dẫn đến phần thứ hai.

Tôi đang làm việc trên một dự án máy chủ PHP và tôi hơi bối rối với tất cả các cách khác nhau mà tôi có thể tạo ra một ổ cắm. Tôi đã quản lý để tạo ba ổ cắm mỗi lần sử dụng một phương thức mới. Có ai biết sự khác biệt cơ bản giữa ba phương pháp này nếu có?

Phương pháp 1 sử dụng 'socket_create'

$Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
socket_bind($Socket1, $LocalIP, $LocalPort)
socket_connect($Socket1, $DestIP, $DestPort)
//Method 1 Read
socket_read($Socket1)
//Method 1 Write
socket_write($Socket1, $WriteMsg, strlen($WriteMsg))

Phương pháp 2 sử dụng 'fsockopen'

$Socket2 = fsockopen($Server, $Port)
//Method 2 Read
fgets($Socket2)
//Method 2 Write
fputs($Socket2, $PutMsg, strlen($PutMsg))

Phương pháp 3 sử dụng 'stream_socket_client'

$Socket3 = stream_socket_client('tcp://'.$DestIP.':'.$DestPort)
//Method 3 Read
stream_socket_recvfrom($Socket3, $RecSize)
//Method 3 Write
stream_socket_sendto($Socket3, $SendMsg)

Mặc dù tôi không hiểu sự khác biệt nhưng tôi đã khám phá cả ba tùy chọn đang tìm cách để kiểm soát kích thước cửa sổ TCP. Tôi đang cố gắng đẩy một gói đến máy khách qua mạng LAN của tôi có tải trọng dữ liệu là 1460 byte và sau khi xem xét một gói thu thập, phần dữ liệu TCP của gói của tôi luôn bị cắt ngắn ở 1448 byte. Bất kỳ ý tưởng?

Cảm ơn trước!

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ẻ