2011-12-05 53 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