akka io tcp服务器

时间:2013-03-17 18:41:14

标签: tcp io akka

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

// 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测试服务器actor并且具有这种“奇怪”行为:只有连接到服务器的第一个客户端才接收从服务器发送的消息。 nexts客户端可以连接到服务器但不接收消息。同样在调试模式下,服务器角色没有获得 Tcp.Connected 消息(第一个连接的客户端除外),因此注册消息无法发送到客户端,尽管下一个客户端可以连接

1 个答案:

答案 0 :(得分:1)

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

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