博客
关于我
android中非堵塞socket通信
阅读量:796 次
发布时间:2023-03-28

本文共 2578 字,大约阅读时间需要 8 分钟。

什么是同步与异步,堵塞与非堵塞?

在编程中,同步与异步、堵塞与非堵塞是常见的概念,但它们之间存在着一些混淆。我们需要从根本上理解它们的区别以及如何在实际开发中应用。

1. 同步编程

同步编程是指在发出一个功能调用时,当前线程会一直等待,直到该函数或操作完成之前,该调用才会返回。这种方式在单线程环境下非常常见,尤其是在需要确保数据一致性的场景中。

在Android中,UI线程的不安全性使得我们通常需要使用同步机制。例如,通过handler.SendMessage函数实现同步线程传递数据。这种方式确保了数据能够及时传递给目标窗体,但也需要注意避免在主线程中进行长时间的同步操作,以免阻塞UI线程。

2. 异步编程

异步编程则相反。它允许调用者立即返回,而不必等待结果。结果通过回调、监听者模式或观察者模式等方式在后续操作中传递。这在需要处理长时间任务或对UI线程不影响的场景中非常有用。

Android中的AsyncTask类就是一个典型的异步编程工具,它允许在后台线程执行长时间任务,并在任务完成后通过回调将结果传递给UI线程。

3. 堵塞与非堵塞

堵塞和非堵塞则描述了线程的状态:

  • 堵塞:在调用结果返回之前,当前线程会被挂起。函数仅在获得结果后才返回。
  • 非堵塞:在没有得到结果之前,函数会立即返回。结果通过其他机制(如回调)在后续操作中传递。

需要注意的是,堵塞并不一定意味着同步。例如,在网络编程中,Receive函数可能会堵塞当前线程,直到数据到达,但其他线程仍然可以继续执行。

4. 同步与异步的区别

通过买票的案例可以更直观地理解同步与异步的区别:

  • 同步:排队等待,直到买到票后离开。
  • 异步:通知一个监听者买票后,你可以先去别的事情,而不必等待结果。

关键知识点

1. java.net.InetSocketAddress

InetSocketAddress是一个实现IP套接字地址的类。它可以表示为IP地址加端口号,或者主机名加端口号。在解析主机名失败的情况下,它仍然可以作为未解析地址使用。

2. java.nio.channels.Selector

选择器用于管理多个通道的I/O操作。通过选择器,可以在单线程内同时监控多个通道的读写状态。这对于处理大量连接非常有用。

3. java.nio.channels.SocketChannel

SocketChannel是Java NIO中用于处理流连接的通道。它支持非堵塞连接和异步关闭,适合在网络编程中高效地处理数据传输。

实例代码演示

以下是连接服务器并处理数据的完整代码示例:

Selector mSelector = null;SocketChannel client = null;InetSocketAddress isa = null;SocketEventListener mSocketEventListener = null;private boolean connect(String site, int port) {    if (mSocketEventListener != null) {        mSocketEventListener.onSocketPause();    }    boolean ret = false;    try {        mSelector = Selector.open();        client = SocketChannel.open();        client.socket().setSoTimeout(5000);        isa = new InetSocketAddress(site, port);        boolean isConnect = client.connect(isa);        if (!isConnect) {            while (!client.finishConnect()) {                EngineLog.redLog(TAG, "等待非堵塞连接建立....");                Thread.sleep(50);                if (waittimes < 100) {                    waittimes++;                } else {                    break;                }            }        }        Thread.sleep(500);        haveRepaired();        startListener();        ret = true;    } catch (Exception e) {        EngineLog.redLog(TAG + " - Connect error", e != null ? e.toString() : "null");        try {            Thread.sleep(1000 * 10);        } catch (Exception e1) {            EngineLog.redLog(TAG + " - Connect error", e1 != null ? e1.toString() : "null");        }        ret = false;    }    return ret;}

关闭通道的注意事项

在关闭套接字通道时,需要注意以下几点:

  • 线程安全:在关闭通道时,确保线程安全。使用interrupt方法中断正在堵塞的线程。
  • 选择器关闭:在关闭选择器前,确保所有相关的选择键已经被移除。
  • 异步关闭:某些情况下,线程可以在关闭输入或输出端时,异步关闭对应的通道。
  • 总结

    通过理解同步与异步的本质,以及掌握Java NIO中的一些核心类,我们可以更高效地进行网络编程。在实际开发中,选择合适的编程模型(同步或异步)以及正确使用相关API,是确保程序高效稳定运行的关键。

    转载地址:http://hshfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现串逐位和(附完整源码)
    查看>>
    Objective-C实现主存储器空间的分配和回收(附完整源码)
    查看>>
    Objective-C实现乘方运算---m的n次方(附完整源码)
    查看>>
    Objective-C实现二叉树遍历算法(附完整源码)
    查看>>
    Objective-C实现二进制和算法(附完整源码)
    查看>>
    Objective-C实现二进制补码算法(附完整源码)
    查看>>
    Objective-C实现互斥锁同步执行两个线程函数(附完整源码)
    查看>>
    Objective-C实现交易密码算法(附完整源码)
    查看>>
    Objective-C实现人工势场法(附完整源码)
    查看>>
    Objective-C实现代理服务器(附完整源码)
    查看>>
    Objective-C实现以递归的形式MatrixExponentiation矩阵求幂算法 (附完整源码)
    查看>>
    Objective-C实现伽玛Gamma函数(附完整源码)
    查看>>
    Objective-C实现位置型pid算法(附完整源码)
    查看>>
    Objective-C实现低通滤波器(附完整源码)
    查看>>
    Objective-C实现使用管道重定向进程输入输出(附完整源码)
    查看>>
    Objective-C实现倒计时(附完整源码)
    查看>>
    Objective-C实现借记款项功能(附完整源码)
    查看>>
    Objective-C实现关系矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现关系矩阵乘法(附完整源码)
    查看>>
    Objective-C实现关系矩阵乘法(附完整源码)
    查看>>