在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)
{
}
}
}
我不明白你的最后一句话。你得到一个SocketTimeoutException当你已经设置套接字读取超时,以及新的读取超时,但将其设置读早已之后阻止对那读无影响。 – EJP