SocketChannel не готов - PullRequest
       9

SocketChannel не готов

1 голос
/ 02 ноября 2010

снова у меня проблема с программированием сокетов в Android. Моя проблема заключается в том, что Selector.select () возвращает ноль, что нет готовых к записи SocketChannels. И снова тот же код работает в обычной Java, но не работает в Android. Вот мой код:

package com.test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class WebSocketTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

  SocketChannel channel = null;

        SocketAddress socketAdress = new InetSocketAddress("10.0.0.1", 8787);

  try {
   channel = SocketChannel.open();
  } catch (IOException e) {
   Log.e("ERROR", "channel open");
  }

  try {
   channel.configureBlocking(false);
  } catch (IOException e1) {
   Log.e("ERROR", "channel blocking");
  }

  try {
   channel.connect(socketAdress);
  } catch (IOException e) {
   Log.e("ERROR", "channel connect");
  }

  try {
   while(!channel.finishConnect())
   {

   }
  } catch (IOException e1) {
   Log.e("ERROR", "channel finishConnect");
  }


  Selector selector = null;
  try {
   selector = Selector.open();
  } catch (IOException e) {
   Log.e("ERROR", "selector open");
  }
  try {
   channel.register(selector, channel.validOps());
  } catch (ClosedChannelException e) {
   Log.e("ERROR", "channel register");
  }

  boolean i = true;

  while(i)
  {
   int readyChannels = 0;
   try {
    readyChannels = selector.select();
   } catch (IOException e) {
    Log.e("ERROR", "selector select");
   }

   if(readyChannels > 0)
   {
    i = false;
   }
  }
    }
}

В Java readyChannels = 1. В Android это 0. Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Эмулятор сидит за виртуальным роутером.Вам необходимо настроить Сетевые перенаправления (переадресация портов), чтобы сделать определенный порт на эмуляторе видимым для внешней сети (включая ваш компьютер).

0 голосов
/ 03 ноября 2010

Существует несколько проблем с этим кодом NIO.

  1. Вместо того, чтобы подключаться, а затем вращаться вокруг finishConnect (), возможно, навсегда, вам следует подключиться перед переходом в неблокирующий режим.В данный момент вы просто сжигаете процессор, разряжаете аккумулятор и т. Д.

  2. Вы должны регистрировать OP_WRITE только тогда, когда вам есть что написать.Обычно он «готов», поэтому, если вы зарегистрируете канал для него постоянно, ваш цикл выбора будет просто вращаться.Единственный раз, когда OP_WRITE не готов, это когда вы заполнили буфер отправки сокета.

...