Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   socket общения между клиентов с одинаковым ИД (http://www.flasher.ru/forum/showthread.php?t=160838)

yo3o 18.07.2011 11:50

socket общения между клиентов с одинаковым ИД
 
socket у меня на ПХП как это можно реализовать?

Gaen 19.07.2011 15:55

К сожалению, телепатию все еще не изобрели.

yo3o 19.07.2011 16:29

Gaen вот скрипт вы можете помочь?


PHP код:

#!/usr/bin/php -q
<?php

error_reporting
(E_ALL);

set_time_limit(0);

ob_implicit_flush();

$address 'localhost';
$port 9996;


//---- Function to Send out Messages to Everyone Connected ----------------------------------------
function send_Message($allclient$buf) {
  global 
$client_list;
  foreach(
$allclient as $client) {
    if(
$client_list[$client]['state'] && $client_list[$client]['nick'] != ""){
      
socket_write($clienttrim($buf).chr(0));
    }
  }
}

//---- Function to Send List of  Everyone Connected ----------------------------------------
function who($allclient$socket) {
  global 
$client_list;
  
$buf "";
  
$counter 0;
  foreach(
$allclient as $client) {
    
$buf.=$client_list[$client]['nick'].", ";
    
$counter++;
  }
 
// socket_write($socket, "There are $counter people in this room: $buf".chr(0));
}

//---- Function to Send out Messages to Individuals ----------------------------------------
function send_Single($socket$buf) {
  
socket_write($socket$buf.chr(0));
}



//---- Start Socket creation for PHP 5 Socket Server -------------------------------------

if (($master socket_create(AF_INETSOCK_STREAMSOL_TCP)) < 0) {
  echo 
"socket_create() failed, reason: " socket_strerror($master) . "\n";
}

socket_set_option($masterSOL_SOCKET,SO_REUSEADDR1);


if ((
$ret socket_bind($master$address$port)) < 0) {
  echo 
"socket_bind() failed, reason: " socket_strerror($ret) . "\n";
}


if ((
$ret socket_listen($master5)) < 0) {
  echo 
"socket_listen() failed, reason: " socket_strerror($ret) . "\n";
}



$read_sockets = array($master);
$client_list = array($master);

//---- Create Persistent Loop to continuously handle incoming socket messages ---------------------
while (true) {
  
$changed_sockets $read_sockets;

  
$num_changed_sockets socket_select($changed_sockets$write NULL$except NULLNULL);

  foreach(
$changed_sockets as $socket) {

    if (
$socket == $master) {

      
//---- Accept Incoming Connections and Request Nickname ----------------------------------------
      
if (($client socket_accept($master)) < 0) {
        echo 
"socket_accept() failed: reason: " socket_strerror($msgsock) . "\n";
        continue;
      } else {
    echo 
"[connection]:$client\n";
        
array_push($read_sockets$client);
    
$client_list[$client]['state'] = false;
    
send_Single($client"<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0");
      }
    } else {

      
//---- Grab Incoming Messages From all Users ----------------------------------------
      
$bytes socket_recv($socket$buffer20480);

      
//---- Handle User Disconnects ----------------------------------------
      
if ($bytes == 0) {
    
$nick $client_list[$socket]['nick'];
        
$iindex array_search($socket$client_list);
        unset(
$client_list[$iindex]);
        
$index array_search($socket$read_sockets);
        unset(
$read_sockets[$index]);
        
socket_close($socket);
        
$allclients $read_sockets;
        
array_shift($allclients);
    if(
$client_list[$socket]['nick'] != "" && $client_list[$socket]['nick'] != "<policy-file-request/>"){
          
send_Message($allclients"$nick has left the room");
    }
      }else{
    if(
$bytes){
          
//---- Set Nickname ----------------------------------------
      
if($client_list[$socket]['state'] === false){
        
$client_list[$socket]['nick'] = $tempBuf trim(trim($buffer));
        echo 
$tempBuf." test";
        
//send_Single($socket, "Hello $tempBuf!  Welcome to the game!");
            
$allclients $read_sockets;
            
array_shift($allclients);
        
who($allclients$socket);
        if(
$client_list[$socket]['nick'] != "" && $tempBuf != "<policy-file-request/>"){
              
//send_Message($allclients, $client_list[$socket]['nick']." has entered the game.");
        
}
        
$client_list[$socket]['state'] = true;
      }else{
            
//---- Check Message for Commands, and Respond or Broadcast Message ----------------------------------------
            
$allclients $read_sockets;
            
array_shift($allclients);
        if(
trim($buffer) == "/who"){
          
who($allclients$socket);
        }else{
                      
send_Message($allclients$client_list[$socket]['']."".$buffer);
              
//send_Message($allclients, $client_list[$socket]['nick']." wrote: ".$buffer);
        
}
      }
    }
      }
    }
  }
}

?>

Добавлено через 11 минут
нужно как-то реализовать что-ли как комнаты для клиентов что-бы определенные клиенты общались с определенными клиентами! просто я делаю онлайн игру на flash и мне нужно реализовать свой внутренний чат для каждой комнате на одно сокете! поможете?

surlac 20.07.2011 00:45

Цитата:

Сообщение от yo3o (Сообщение 1012471)
socket у меня на ПХП

Socket - это API, исходя из постановки задачи, не важно какая у него реализация.
По каждому новому TCP-подключению на серверный сокет сохраняете информацию о пользователе (комната/id) и распространяете сообщения тем пользователям, у которых номер_комнаты==сообщение.номер_комнаты.
А вообще, этот механизм неплохо реализован в SmartFoxServer - комнаты, чат...

yo3o 20.07.2011 17:55

вот именно это мне и нужно! можете помочь с реализацией на пхп?

t4arty 20.07.2011 18:07

это к пхп программисту :)


Часовой пояс GMT +4, время: 05:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.