首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SocketChannel未就绪

SocketChannel未就绪
EN

Stack Overflow用户
提问于 2010-11-03 03:56:35
回答 2查看 1.5K关注 0票数 1

我再一次遇到了Android中套接字编程的问题。我的问题是Selector.select()返回零,表示没有准备好写入的SocketChannels。同样,同样的代码可以在普通Java中运行,但不能在Android中运行。下面是我的代码:

代码语言:javascript
复制
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。有谁可以帮我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-03 06:29:49

仿真器位于虚拟路由器后面。您需要配置Network Redirections (端口转发)以使模拟器上的某个端口对外部网络(包括您的计算机)可见。

票数 2
EN

Stack Overflow用户

发布于 2010-11-03 07:22:10

这段NIO代码有几个问题。

  1. 而不是连接然后旋转finishConnect(),可能永远,你应该在进入非阻塞模式之前连接。
  2. 你应该只在你有东西要写的时候才注册OP_WRITE。它通常是“就绪”的,所以如果你永久地为它注册通道,你的选择循环就会旋转。唯一一次OP_WRITE没有准备好的时候是当你填满了套接字发送缓冲区的时候。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4081594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档