2011-12-05 48 views
2

我正在使用以下類接受來自客戶端應用程序的傳入連接 - 使用send函數我想同時向每個客戶端寫入相同的UTFBytes - 這可能嗎?或者,如果不是,順序寫入它們的最快方式是什麼。寫入多個套接字連接的最快方法

public class ProjectorClients 
{ 
    private var _serverSocket:ServerSocket; 
    private var _clients:Vector.<Socket> = new Vector.<Socket>; 

    private function ProjectorClients():void 
    { 
     _serverSocket = new ServerSocket(); 
     _serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnect) 
     _serverSocket.bind(888); 
     _serverSocket.listen(); 
    } 

    private function onConnect(e:ServerSocketConnectEvent):void 
    { 
     trace("Client is connected"); 
     e.socket.addEventListener(ProgressEvent.SOCKET_DATA, onData); 
     e.socket.addEventListener(Event.CLOSE, onConnectionClosed); 
     _clients.push(e.socket); 
     trace("Number of connected clients: " + _clients.length); 
    } 

    public function send(command:String):void 
    { 
     for each(var clientSocket:Socket in _clients) 
     { 
      if (clientSocket.connected) 
      { 
       clientSocket.writeUTFBytes(command); 
       clientSocket.flush(); 
      } 
     } 
    } 

    private function onData(e:ProgressEvent):void 
    { 
     trace("data received"); 
    } 

    private function onConnectionClosed(e:Event):void 
    { 
     trace("Client Socket is Closed"); 
     for (var i:int = 0; i < _clients.length; i++) 
     { 
      if (_clients[i] == e.currentTarget) 
      { 
       _clients.splice(i,1); 
       break; 
      } 
     } 
     trace("Number of connected clients: " + _clients.length); 
    } 

} 
+0

您正在設置基礎架構還是可部署應用程序?如果這是Java或.Net,我會建議讓服務器只寫入一次分佈式發佈 - 訂閱消息系統,如Apache/Kafka。我不知道是否有任何針對actionScript的快速隊列解決方案。 – eSniff

+0

這是針對可部署as3的應用程序。感謝提示,我會研究這個以備將來使用。 – davivid

+0

如何在一個循環中寫入,然後在第二個相同的循環中沖洗? –

回答

0

正如@eSniff提到的,您需要一個發佈訂閱模塊。 Redis將是一個更好的選擇,因爲它需要最少的步驟來設置。傳入連接將預訂隊列,並且您可以發佈數據,以便所有客戶端都可以同時接收數據。請參閱下面的鏈接以獲得更好的理解。

http://redis.io/topics/pubsub