2012-06-11 49 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

相關問題