如何中止 LocalServerSocket.accept

Posted

技术标签:

【中文标题】如何中止 LocalServerSocket.accept【英文标题】:How to abort LocalServerSocket.accept 【发布时间】:2011-12-15 19:48:28 【问题描述】:

如何在后台线程中中止/中断 LocalServerSocket 等待方法 LocalServerSocker.accept() 中的连接?

我尝试从另一个线程调用 close() 方法,但它似乎不起作用。

【问题讨论】:

【参考方案1】:

android 项目中为它打开了一张票:http://code.google.com/p/android/issues/detail?id=29939。

似乎问题已被 Google 确认,因为第一条评论是:

我认为我们应该重写它以使用相同的底层 libcore 东西,并免费获得中断行为。

解决方法可以是从另一个线程向 LocalServerSocket 发送自定义关闭命令以取消阻止接受。

【讨论】:

你的意思是我需要写一个LocalServerSocket的子类并添加一个参数来杀死线程? 不,在我的情况下,是连接到本地套接字的单独线程解除了accept()的阻塞,因此LocalServerSocket线程可以关闭套接字并退出。【参考方案2】:

用这个代替localSocket.close:(需要API 21+)

try 
    Os.shutdown(localSocket.fileDescriptor, OsConstants.SHUT_RDWR)
 catch (e: ErrnoException) 
    if (e.errno != OsConstants.EBADF) throw e   // suppress fd already closed

【讨论】:

以上是关于如何中止 LocalServerSocket.accept的主要内容,如果未能解决你的问题,请参考以下文章

如何在不中止 erl 的情况下中止 Erlang shell (erl) 中的接收语句?

如何中止获取请求?

如何中止 LocalServerSocket.accept

您如何中止/结束 Chef 运行?

如何在放心的框架中仅中止一个请求?

如何中止winsock阻塞调用?