Почему SelectionKey, зарегистрированный в DatagramChannel, возвращает SelectableChannel в Scala, но не в Java? - PullRequest
0 голосов
/ 25 января 2010

Я преобразовываю некоторый код Java NIO для запуска в Scala и получаю сообщение об ошибке, потому что вызываемый мной SelectionKey возвращает SelectableChannel, а не DatagramChannel, который является подклассом SelectableChannel и экземпляром, который я объявляю на начало кода. Я не пришел в Scala с Java, поэтому мои знания Java на самом деле очень ограничены. Мне кажется, что код Java DatagramChannel channel = (DatagramChannel) key.channel(); передает канал в DatagramChannel. Это то, что мне нужно сделать в коде Scala?

Скала код:

val channel = DatagramChannel.open()
val selector = Selector.open()
println("Attempting to bind to socket " + port)
channel.socket().bind(new InetSocketAddress(port))
println("Bound to socket " + port)
channel.configureBlocking(isBlocking)
println("Attempting to registered selector")
channel.register(selector, SelectionKey.OP_READ)
println("Registered selector")

println("Ready to receive data!");
while (true) {
  try {
    while(selector.select() > 0) {
      val keyIterator = selector.selectedKeys().iterator();
      while (keyIterator.hasNext()) {
        val key = keyIterator.next();
        if (key.isReadable()) {
          val channel = key.channel(); // FIXME: returning a SelectableChannel instead of a DatgramChannel
          var buffer: Array[Byte] = Array();
          val byteBuffer = ByteBuffer.wrap(buffer);
          val sockAddress = channel.receive(byteBuffer);
// ...

Оригинальный код Java:

channel = DatagramChannel.open();
selector = Selector.open();
System.out.println("Attempting to bind to socket " + port);
channel.socket().bind(new InetSocketAddress(port));
System.out.println("Bound to socket " + port);
channel.configureBlocking(isBlocking);
System.out.println("Attempting to registered selector");
channel.register(selector, SelectionKey.OP_READ);
System.out.println("Registered selector");
System.out.println("Ready to receive data!");
while (true) {
  try {
    while(selector.select() > 0) {
      Iterator keyIterator = selector.selectedKeys().iterator();
      while (keyIterator.hasNext()) {
        SelectionKey key = (SelectionKey) keyIterator.next();
        if (key.isReadable()) {
          DatagramChannel channel = (DatagramChannel) key.channel();
          byte[] buffer = new byte[2048];
          ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
          SocketAddress sockAddress = channel.receive(byteBuffer);
// ...

1 Ответ

2 голосов
/ 25 января 2010

SelectionKey.channel () всегда возвращает SelectableChannel . Назначенный тип канала на данный момент не имеет отношения к делу, поэтому вам придется использовать его.

...