代码之家  ›  专栏  ›  技术社区  ›  Arne

Scala远程参与者阻止客户端终止

  •  2
  • Arne  · 技术社区  · 15 年前

    我正在写一个简单的聊天服务器,我想保持它尽可能简单。下面列出的我的服务器只接收连接并将它们存储在客户端集中。然后将传入消息广播到该服务器上的所有客户端。服务器可以正常工作,但在客户端,RemoteActor会阻止我的程序终止。有没有办法在不终止服务器上的参与者的情况下删除我客户端上的参与者?

    我还不想用“每个客户一个演员”的模式。

     import actors.{Actor,OutputChannel}
     import actors.remote.RemoteActor
    
     object Server extends Actor{
      val clients = new collection.mutable.HashSet[OutputChannel[Any]]
      def act{
       loop{
        react{
         case 'Connect =>
          clients += sender
         case 'Disconnect =>
          clients -= sender
         case message:String =>
          for(client <- clients)
          client ! message
        }
       }
      }
    
      def main(args:Array[String]){
       start
       RemoteActor.alive(9999)
       RemoteActor.register('server,this)
      }
     }
    

    我的当事人会变成这样

    val server = RemoteActor.select(Node("localhost",9999),'server)
    server.send('Connect,messageHandler) //answers will be redirected to the messageHandler
    /*do something until quit*/
    server ! 'Disconnect
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Michael Neale    15 年前

    我建议将客户端代码放入actor本身——即在主线程中不调用alive/register

    (由 http://www.scala-lang.org/api/current/scala/actors/remote/RemoteActor$.html )

    有点像

    //body of your main: 
    val client = actor { 
       alive(..)
       register(...)
       loop { 
           receive {
               case 'QUIT => exit()
           }
        } 
    }
    client.start
    //then to quit:
    client ! 'QUIT
    

    或者类似的(很抱歉我没有使用2.8,所以可能弄糟了一些东西-如果你让它真正为你工作,请随意编辑!).

    推荐文章