2010-07-26 2 views
2

Я пытаюсь научиться общаться с сервером сокета.Объяснить базовый код сервера Socket

Я заметил, что каждый использует тот же код (ripoff из зоны разработки zend).
Проблема в том, что никто не объясняет, как это работает. Особенно критический код после while (true) {.

Это принесет пользу многим, поэтому я надеюсь, что кто-то сможет потратить время и подробно объяснить код (ДЕТАЛЬ!).

You can find the code here

+0

Ничего себе. Отображение сайта, на которое вы ссылаетесь, почти невыносимо медленное. – relet

+0

Я попробовал установить код, но у меня были проблемы. просто google "php socket server tutorial", и код в основном одинаковый везде (все они сбрасывают zend) – Putr

ответ

2

Отвечу это myselfe. Я пошел по ней построчно .. вот как это работает (я только объяснить часть в то время (правда) петли.

1.

// Setup clients listen socket for reading 
$read[0] = $sock; 
for ($i = 0; $i < $max_clients; $i++) { 
    if (isset($client[$i]['sock'])) 
     $read[$i + 1] = $client[$i]['sock']; 
} 

Это asings недавно созданные подключения к $ прочитать массив наблюдать за входящие данные.

// Set up a blocking call to socket_select() 
if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1) 
    continue; 

Часы массив $ прочитанного для новых данных (я все еще немного неясно, как это работает)

/* if a new connection is being made add it to the client array */ 
if (in_array($sock, $read)) { 
    for ($i = 0; $i < $max_clients; $i++) { 
     if (empty($client[$i]['sock'])) { 
      $client[$i]['sock'] = socket_accept($sock); 
      echo "New client connected $i\r\n"; 
      break; 
     } 
     elseif ($i == $max_clients - 1) 
      echo "Too many clients...\r\n"; 
    } 
} 

Определяет, когда выполняется новое соединение, чем находит пустое место в массиве $ client и добавляет сокет.

В этой следующей части я разберусь для упрощения объяснения.

for ($i = 0; $i < $max_clients; $i++) { // for each client 
    if (isset($client[$i]['sock'])) { 

Петли через весь массив $ client, но работают только с теми, у которых действительно есть соединение.

if (in_array($client[$i]['sock'], $read)) { 
      $input = socket_read($client[$i]['sock'], 1024); 
      if ($input == null) { 
       echo "Client disconnecting $i\r\n"; 
       // Zero length string meaning disconnected 
       unset($client[$i]); 
      } else { 
       echo "New input received $i\r\n"; 
       // send it to the other clients 
       for ($j = 0; $j < $max_clients; $j++) { 
        if (isset($client[$j]['sock']) && $j != $i) { 
         echo "Writing '$input' to client $j\r\n"; 
         socket_write($client[$j]['sock'], $input, strlen($input)); 
        } 
       } 
       if ($input == 'exit') { 
        // requested disconnect 
        socket_close($client[$i]['sock']); 
       } 
      } 
     } else { 
      echo "Client disconnected $i\r\n"; 
      // Close the socket 
      socket_close($client[$i]['sock']); 
      unset($client[$i]); 
     } 

Сначала он видит, есть ли еще активное соединение, если оно не закрывается. Если есть соединение, оно считывает данные, если нет этого, это код для отключения. Если есть данные, он передает их другим клиентам (но сам по себе).

Это ти. Надеюсь, я все понял.

Смежные вопросы