`
ericbaner
  • 浏览: 176970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Android NIO Socket编程

 
阅读更多

根据前两周写的关于Socket编程的网络通信的代码,现在对有关知识和注意事项进行总结如下:

1.首先说下Android NIO中有关Socket编程的类

1)ServerSocketChannel类:服务器套接字通道相当于传统IO下的ServerSocket,通过ServerSocketChannel的socket()可以获得传统的ServerSocket,反过来使用ServerSocket的getChannel()可以获得ServerSocketChannel对象;实例化ServerSocketChannel可以直接通过ServerSocketChannel的静态方法open()就可以了。

2)SocketChannel类:套接字通道相当于传统IO下的Socket,通过SocketChannel的socket()可以获得传统的Socket,反过来使用Socket的getChannel()可以获得SocketChannel对象;

3)Selector选择器:在NIO中注册各种事件的方法主要使用Selector来实现的,我们可以使用Selector类的静态方法open()来实例化。

4)SelectionKey类:是个选择键,在NIO中选择器和选择键是很重要的,SelectionKey描述了NIO中比较重要的事件,如OP_ACCEPT、OP_READ、OP_WRITE。

 

2.然后说下非阻塞和阻塞模式的区别以及非阻塞模式的实现

1)非阻塞:所谓非阻塞就是说,服务器监听客户端连接的时候,如果没有客户连接,程序还接续执行,不会停在这里等待客户连接;或者客户连接上了,下一步就是等待客户发数据,如果不发,程序不会停留在这里,而是继续执行。反过来停留在这里,不继续执行就是阻塞。

2)非阻塞模式的实现:对于客户端来说,得到SocketChannel对象后,通过调用方法configureBlocking(false)来设置这个Socket为非阻塞状态。然后在配合Selector和SelectionKey的使用来与服务器进行交互。代码如下:

  SocketChannel socket = new SocketChannel(ip,port);

   socket.configureBlocking(false);
   mSelector = Selector.open();
   socket.register(mSelector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

   while (true) {

          mSelector.select(0);
          Set<SelectionKey> readKeys = mSelector.selectedKeys();
          Iterator<SelectionKey> iterator = readKeys.iterator();
          while (iterator.hasNext()) {
              SelectionKey key = (SelectionKey) iterator.next();
              iterator.remove();
              if (key.isReadable()) {.....
              } else if (key.isWritable()) {.....
              }

            }

    }

 

3. 消息处理机制—Message Handler Looper

  Message消息 Handler处理发送和接收消息 Looper管理消息,就是一个手柄

 在什么情况下使用消息呢?比如一个子线程,在执行过程中要更改主线程UI的一个控件值,这个时候就需要发送一个消息给主线程,而使用消息处理机制也可以不干扰主线程执行其他操作,在主线程中只要Handler感应到有信息过来它会自己接收,然后处理。代码如下:

 在主线程:声明一个Handler

Handler mHandler = new Handler() {

   @Override
   public void handleMessage(Message msg) {
    super.handleMessage(msg);
         }
  };

在子线程:

 public void sendMessage(String message, int what) {
     Message msg = mHandler.obtainMessage(what, 1, 1, message);
     mHandler.sendMessage(msg);
 }

 注意子线程中的Handler必须是主线程声明的Handler,这样子线程发送的消息才能被主线程Handler认识接收。

 

4.遇到的问题

1)线程问题:Socket编程中,实现服务器与多个客户端的通信要尽量用多线程机制来实现,当服务器监听到一个客户端的连接就开辟一个线程专门负责与客户端的通信,如果客户端因为某个原因断开与服务器的连接就要及时关闭线程;当然如果是服务器断开了,那么就要关闭所有与客户通信的线程。Android开发中,要注意一点,比较耗时的操作最好开辟一个线程单独执行,不然主线程因为执行这个耗时的操作而耽误执行其他操作,这样导致程序效率很差。

2)网络问题:Android开发中,往往遇到服务器与客户端正在通信时候突然网络断了,这个时候就要关闭socket,但是在关闭socket的时候,双方要知道网络断了才能关闭,如果是人为关闭socket,另一方肯定能检测到,但是是网络突然断开,就不能检测到了,解决这样的方法就是,双方连接上后,每隔一段时间发一个保护数据包,这个数据包双方只管发送,接收不进行处理,如果在一段时间内,一方既没有发送正常的数据包也没有发送保护数据包,那就关闭socket,这样就解决了网络断开的问题导致一方没有及时关闭socket的问题。

3)socket关闭问题:在进行socket编程中,遇到异常或者其他需要断开连接的情况时,socket要及时关闭,而在关闭socket之前,要保证线程关闭;举个列子说下,客户端人为断开与服务器的连接,此时服务器就会检测到与这个客户的通道已经关闭而出现异常,此时服务器就要关闭线程和socket。

还有一个特别重要的问题,在Android开发中,如果服务器与客户端通信的时候,如果没有定义一个协议,只是简单的发送一个字符串,那么如果某一方发送一个空值,这个时候另一方就会默认的认为你没有发送数据。解决这个问题的办法就是,要么定义一个规范的协议发送数据,也就是每发送一个数据都有一个头,要么定义一个专门的数据包(如byte类型的 1 )代表一个空值。

-----------------------------------------------------------------------------

分享到:
评论

相关推荐

    NioSocket,包括server端和client端

    在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心特点是能够进行多路复用,即一个线程可以同时处理多个连接,这使得NioSocket在高并发场景下具有较好的性能表现。 服务器端...

    android-socket-nio-master.zip

    "android-socket-nio-master.zip" 是一个关于Android中使用Socket结合NIO实现高效通信的项目,其目标是提高Socket通信的性能和处理大量并发连接的能力。 NIO(非阻塞I/O)是Java提供的一个替代传统I/O的API,主要...

    基于android的socket编程实例

    在Android平台上进行Socket编程是构建网络通信应用的关键技术之一。Socket提供了一种点对点的通信机制,使得Android设备能够与其他设备或者服务器进行数据交换。本文将深入探讨基于Android的Socket编程实例,涵盖其...

    Android Socket 编程案例

    在Android开发中,Socket编程是实现设备间通信的重要方式,特别是在构建客户端-服务器应用程序时。本案例中,我们将探讨如何使用Android作为客户端,通过Socket与Java服务器端进行数据交换。首先,确保Android应用...

    Android Socket编程 收发数据

    除了基本的Socket编程,还可以使用NIO(Non-blocking I/O)或AsyncTask等机制优化性能,特别是当需要同时处理大量连接时。此外,注意处理网络异常,如IOException,以及在网络不稳定时的数据重传策略。 总之,...

    Android-MinaSocket一款基于Mina的Socket长连接库

    **Android-MinaSocket:基于Mina的高效Socket长连接库** 在移动应用开发中,尤其是Android平台,实时性与稳定性是许多应用场景的核心需求,比如在线游戏、即时通讯、物联网设备等。在这种背景下,使用Socket进行长...

    Android-netty和socket通信的demo

    本示例“Android-netty和socket通信的demo”将展示如何在Android平台上利用Netty进行网络通信,与传统的Socket编程相结合,实现更加灵活和高效的通信机制。 首先,理解Netty的基本概念是非常重要的。Netty是一个...

    Socket与NIO的Demo.rar

    用于博文https://blog.csdn.net/lyz_zyx/article/details/104062815《Android网络编程(十四) 之 Socket与NIO》中演示Socket与NIO使用的Demo

    Android-OkSocket一个Android轻量级Socket通讯框架

    Android OkSocket是一款基于JavaNIO和传统Socket的一款Socket客户端整体解决方案.您可以使用它进行简单的基于Tcp协议的Socket通讯,当然,也可以进行大数据量复杂的Socket通讯,支持单工,双工通讯.

    Android-AndroidAsync异步SocketHTTP(客户端服务器)WebSocket和socket.io库

    Socket编程是网络通信的基础,它允许应用程序之间建立直接的、双向的数据通道。在Android中,使用Socket进行网络通信需要处理多个线程,但通过使用NIO,可以避免创建大量线程导致的性能问题。AndroidAsync库就利用了...

    android基于WiFi的socket客户端和服务器端

    在进行Socket编程时,需要申请相应的网络权限,如 `&lt;uses-permission android:name="android.permission.INTERNET" /&gt;`。 7. **Android网络限制**:Android系统对后台网络活动有限制,为了在后台保持Socket连接,...

    andriod聊天室Socket编程

    在Android平台上实现聊天室功能,通常会涉及到网络通信技术,其中Socket编程是常见的选择。Socket是一种基于TCP/IP协议的通信方式,它允许设备之间进行双向数据传输,非常适合于构建聊天应用。在这个场景下,服务端...

    AndroidSocket聊天室

    在Android平台上,构建一个Socket聊天室是一个典型的网络通信应用场景,主要涉及到Java的Socket编程和Android的客户端开发。本文将深入探讨如何使用Socket技术在Android上实现一个简单的聊天室功能。 首先,我们...

    Android应用与framework的socket通信实例

    在Android中,我们可以使用Java的Socket类或者基于NIO的Selector和Channel来实现网络通信。对于Android应用层来说,主要使用Java的Socket API。 在Android应用与framework的Socket通信中,Android应用作为客户端,...

    android 与 PC socket 通信示例测试过

    本示例探讨的是通过Socket编程实现Android设备与个人计算机(PC)之间的数据交互。Socket,也被称作套接字,是网络通信的基础组件,允许两台设备之间建立连接并交换数据。 首先,我们要理解Socket的工作原理。Socket...

    Androidsocket通讯demo

    在Android平台上进行网络编程时,Socket通信是一种常见且重要的技术,用于实现客户端和服务端之间的数据交换。本示例"Android Socket通讯demo"旨在演示如何在Android应用中建立和使用Socket连接,实现双向的数据收发...

    Android应用与framework的socket通信示例

    在Android中,我们可以使用Java的`java.net.Socket`类或原生C++的`socket`函数进行Socket编程。 1. **Android应用层的Socket通信**: 在Android应用层,我们可以创建一个普通的Java Socket客户端来连接运行在...

    基于Socket的简单的Android聊天室,易学,易懂

    本项目"基于Socket的简单的Android聊天室"提供了一个学习和理解Socket编程在Android平台上的应用的实例。这个聊天室简单易学,适合初学者入门。 Socket在计算机网络中起到了桥梁的作用,它允许两台机器通过互联网...

    NIO加线程池实现Android消息推送

    本项目"**NIO加线程池实现Android消息推送**"旨在通过Java NIO和线程池技术构建一个高效的推送系统,尤其适用于服务器需要处理大量并发连接的情况。 首先,我们来理解NIO(Non-blocking Input/Output)的概念。NIO...

    Android大作业.zip

    1. **Android Socket通信**:Android应用程序可以使用Socket类进行网络通信,Socket提供了基于TCP/IP协议的低级别网络通信接口。 2. **非阻塞I/O(NIO)**:与传统的阻塞I/O不同,非阻塞I/O允许应用程序在等待数据...

Global site tag (gtag.js) - Google Analytics