read()方法是阻塞式方法,但是接受不到消息总不能让它一直阻塞,求神人指点如何打断这个read方法
可以先用available()方法判断可以读取多少内容,再读取。这样避免read()方法发生阻塞。
例:
public void test(InputStream in){byte[] bs=new byte[1024];
while(true){
try {
int available=in.available();// 可读取多少字节内容
if(available==0){// 没有可读取内容则退出
break;
}else{// 读取内容并输出
in.read(bs,0,available);
System.out.print(new String(bs,0,available));
}
Thread.currentThread().sleep(200);// 睡眠一段时间
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
available()的说明有一段话,很迎合你现在的问题:
Firstly, the guarantee is "without blocking for more input" rather than
"without blocking": a read may still block waiting for I/O to complete — the
guarantee is merely that it won't have to wait indefinitely for data to be
written. The result of this method should not be used as a license to do I/O on
a thread that shouldn't be blocked.
你的这种是可以实现的,我是想做服务器,由于字数限制没有讲的很明白,但是作为服务器的话,承载量肯定有问题,,不过得谢谢你教了我一招,谢谢你的耐心讲解。
socket.getInputStream();就是这个输入流,我也不知道具体是哪个
追答Socket也不是流是阻塞的啊!
ServerSocket ss = new ServerSocket(1234);
Socket socket=server.accept(); //这条语句是阻塞方式工作的,和流没有关系,服务端负责监听端口,这个时候等待客户端的连接。如果有客户端连接,就会创建一个表示客户端的Socket对象。下面就可以通过socket获得输入流来读取数据了。
而流InputStream并不是阻塞方式工作的。
你可以重写这个方法
实现相应的效果
我建议直接用多线程挂起
这样不打断也不影响你的使用追问
我觉得你这种方法切实可行,不过有点复杂,能说的确切点吗?,比如,如何发回read读到的数据等。
追答byte a = inputStream.read();//方法1
byte b[] = new byte[255];//方法2
inputStream.read(b);
while(flag){
in = socket.getInputStream();
in.read(data);
}
public void close(){
this.flag = false ;}
接受到close命令时,调用close方法,但是flag虽然赋值为false但是已经
被read阻塞,只有再接收到命令的时候才能关闭,所以想找个方法,能够直接关闭线程
明白了 你用线程会不?