2012-06-11 47 views
1

在Android上使用localsockets。我有一位用户正在阅读另一个连接。通过关闭套接字,关闭输入流并中断它的线程,告诉连接停止读取。它不停止尝试阅读,直到另一端关闭。那么,有没有办法让它中断读取?在被封锁的情况下,Android LocalSocket不会关闭

这是我的问题的一个简单的例子。当您尝试使用频道时,问题会变得更加糟糕。它将分别阻塞线程/通道上的中断/关闭请求。

你应该得到这个日志:

V/test (4416): bound 
V/test (4416): accepted 
V/test (4416): stop 
V/test (4416): stop exit 
V/test (4416): closing 
V/test (4416): done reading? 
V/test (4416): all closed 

第1类:

public class Runner1 implements Runnable 
{ 

public static Runner1  me = null; 

public InputStream   in; 
public ReadableByteChannel rb; 
LocalSocket     ls; 
public Thread    thisThread; 

public Runner1() { 
    me = this; 
} 

@Override 
public void run() 
{ 
    thisThread = Thread.currentThread(); 
    try 
    { 
     LocalServerSocket lss = new LocalServerSocket(Test2Activity.location); 
     ls = lss.accept(); 
     Log.v("test", "accepted"); 

     in = ls.getInputStream(); 
     byte[] buffer = new byte[10]; 
     in.read(buffer); 
     // rb = Channels.newChannel(in); 

     // ByteBuffer bb = ByteBuffer.allocate(100); 
     // rb.read(bb); 
     Log.v("test", "done reading?"); 
     ls.close(); 
     lss.close(); 
     Log.v("test", "all closed"); 
    } 
    catch (IOException e) 
    { 
     Log.v("test", "error1"); 
     e.printStackTrace(); 
    } 
} 

public static void stop() 
{ 
    Log.v("test", "stop"); 
    try 
    { 
     // me.rb.close(); 
     me.in.close(); 
     me.ls.close(); 
     // me.ls.shutdownInput(); 
     // me.ls.shutdownOutput(); 
    } 
    catch (IOException e) 
    { 
     Log.v("test", "error - stop" + e.toString()); 
     e.printStackTrace(); 
    } 

    me.thisThread.interrupt(); 

    Log.v("test", "stop exit"); 
} 
} 

等级2:

public class Runner2 implements Runnable 
{ 
@Override 
public void run() 
{ 

    try 
    { 
     sleep(1500); 
     LocalSocket ls = new LocalSocket(); 
     ls.connect(new LocalSocketAddress(Test2Activity.location)); 
     Log.v("test", "bound"); 
     WritableByteChannel wc = Channels.newChannel(ls.getOutputStream()); 
     sleep(3000); 
     Runner1.stop(); 
     sleep(4000); 
     Log.v("test", "closing"); 
     ls.close(); 
    } 
    catch (IOException e) 
    { 
     Log.v("test", "error" + e.toString()); 
     e.printStackTrace(); 
    } 
} 

public void sleep(int time) 
{ 
    try 
    { 
     Thread.sleep(time); 
    } 
    catch (InterruptedException e1) 
    { 
    } 
} 
} 

回答

0

我能找到解决这个最好的黑客是设置超时并检查套接字是否在另一个线程中关闭。

可悲的是,当你设置超时:(

+0

我不明白你的最后一句话。你得到一个SocketTimeoutException当你已经设置套接字读取超时,以及新的读取超时,但将其设置读早已之后阻止对那读无影响。 – EJP

0

就关机输入插座你没有得到一个TimeoutException。这将提供一个EOS的阅读()。读线程应该然后关闭套接字本身和退出,这应该已被编码。

+0

问题是关闭LocalSocket _does not_提供的EOS的阅读()(与TCP套接字的行为)。和关闭的InputStream刚刚关闭的T他LocalSocket:https://android.googlesource.com/platform/frameworks/base/+/android-8.0.0_r17/core/java/android/net/LocalSocketImpl.java#77 – rom1v

+0

啊,你可能谈到的https:/ /developer.android.com/reference/android/net/LocalSocket.html#shutdownInput()。谢谢,它的作品:) – rom1v

相关问题