android使用NIO的Socket通信,无法收到返回值

Nihn 2012-05-23 04:44:53
大家好!
请教一个问题。
如下代码在java工程中运行,可以获得socket的返回值,但是在android工程中运行,shijian(代码shijian == 0的判断处)一直为0,说明返回事件数量为0,因此阻塞,也无法获取socket的返回值。
请问一下,这个是什么原因造成的,该如何解决。
谢谢!

public void start() {
try {
// 定义一个记录套接字通道事件的对象
Selector selector = Selector.open();
// 定义一个服务器地址的对象
SocketAddress address = new InetSocketAddress("xxx.xxx.xxx.xxx", 55555);
// 定义异步客户端
SocketChannel client = SocketChannel.open(address);
// 将客户端设定为异步
client.configureBlocking(false);
// 在轮讯对象中注册此客户端的读取事件(就是当服务器向此客户端发送数据的时候)
client.register(selector, SelectionKey.OP_READ);
// 要发送的数据
String a = "<request cust=\"3006\"></request>";
// 定义用来存储发送数据的byte缓冲区
ByteBuffer sendbuffer = ByteBuffer.allocate(1024);
// 定义用于接收服务器返回的数据的缓冲区
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
// 将数据put进缓冲区
sendbuffer.put(a.getBytes("UTF-8"));
// 将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中读取数据发向服务器,就要复位
sendbuffer.flip();
// 向服务器发送数据
client.write(sendbuffer);
System.out.println("发送数据: " + new String(sendbuffer.array()));

// 利用循环来读取服务器发回的数据
while (true) {
// 如果客户端连接没有打开就退出循环
if (!client.isOpen())
break;
// 此方法为查询是否有事件发生如果没有就阻塞,有的话返回事件数量
int shijian = selector.select();
// 如果没有事件返回循环
if (shijian == 0) {
continue;
}
// 定义一个临时的客户端socket对象
SocketChannel sc;
// 遍例所有的事件
for (SelectionKey key : selector.selectedKeys()) {
// 删除本次事件
selector.selectedKeys().remove(key);
// 如果本事件的类型为read时,表示服务器向本客户端发送了数据
if (key.isReadable()) {
// 将临时客户端对象实例为本事件的socket对象
sc = (SocketChannel) key.channel();
// 定义一个用于存储所有服务器发送过来的数据
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 将缓冲区清空以备下次读取
readBuffer.clear();
// 此循环从本事件的客户端对象读取服务器发送来的数据到缓冲区中
while (sc.read(readBuffer) > 0) {
// 将本次读取的数据存到byte流中
bos.write(readBuffer.array());
// 将缓冲区清空以备下次读取
readBuffer.clear();
}
// 如果byte流中存有数据
if (bos.size() > 0) {
// 建立一个普通字节数组存取缓冲区的数据
byte[] b = bos.toByteArray();

System.out.println("接收数据: " + new String(b));
// 关闭客户端连接,此时服务器在read读取客户端信息的时候会返回-1
client.close();
System.out.println("连接关闭!");
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
...全文
810 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JAVA2010CZP 2013-02-22
  • 打赏
  • 举报
回复
请问LZ你的socket连接的IP怎么直达的呢?公网静态IP?
Nihn 2012-05-23
  • 打赏
  • 举报
回复
有没有高手知道啊?

自己顶一下。
Nihn 2012-05-23
  • 打赏
  • 举报
回复
就是在onCreate里加了start()进行调用,另外就是在AndroidManifest.xml里加了
<uses-permission android:name="android.permission.INTERNET" />


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

start();
}
李狗蛋52635 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
大家好!
请教一个问题。
如下代码在java工程中运行,可以获得socket的返回值,但是在android工程中运行,shijian(代码shijian == 0的判断处)一直为0,说明返回事件数量为0,因此阻塞,也无法获取socket的返回值。
请问一下,这个是什么原因造成的,该如何解决。
谢谢!
Java code

public void start() {
tr……
[/Quote]

这说明问题已经和这段代码无关了,去看看你Android里是怎么整合的吧。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧