0

我正在使用新的 Akka IO 并遵循本教程(这是一个简单的服务器-客户端应用程序)。我的服务器参与者系统代码如下所示:

// create the sever system
    ActorSystem tcpServerSystem = ActorSystem.create("tcp-server-system");


    // create the tcp actor
    final ActorRef tcpServer = Tcp.get(tcpServerSystem).manager();

    // create the server actor;
    ActorRef serverActor = tcpServerSystem.actorOf(new Props(ServerActor.class).withRouter(new RoundRobinRouter(5)), "server");

    // tell the tcp server to use an actor for listen connection on;
    final List<Inet.SocketOption> options = new ArrayList<Inet.SocketOption>();
    options.add(TcpSO.reuseAddress(true));

    tcpServer.tell(TcpMessage.bind(serverActor, new InetSocketAddress("127.0.0.1", 12345), 10, options),
            serverActor);

ServerActor类只是一个普通的演员,它的onReceive执行以下操作:

logger.info("Received: " + o);
    if (o instanceof Tcp.Connected){
        connectionActor = getSender();
        connectionActor.tell(TcpMessage.register(getSelf()), getSelf());
        ByteStringBuilder byteStringBuilder = new ByteStringBuilder();
        byteStringBuilder.putBytes("Hello Worlds".getBytes());
        connectionActor.tell(TcpMessage.write(byteStringBuilder.result()), getSelf());
    }

我正在尝试使用 netcat 测试服务器参与者并具有这种“奇怪”的行为:只有第一个连接到服务器的客户端正在接收从服务器发送的消息。nexts 客户端可以连接到服务器但没有收到消息。同样在调试模式下,服务器参与者没有收到Tcp.Connected消息(第一个连接的客户端除外),因此无法向客户端发送注册消息,尽管下一个客户端可以连接。

4

1 回答 1

1

这是 2.2-M1 里程碑中的一个已知问题,其中问题是 TcpListener 没有在选择器上注册 AcceptInterest,除非它达到配置的 BatchAcceptLimit,导致如果只有几个连接,它不会收到新接受的通知待办的。

它已被修复,并将成为下一个里程碑版本的一部分。

于 2013-03-18T13:15:40.623 回答