使用线程从InputStream读取数据



我试图使用InputStream类的read()方法,但它阻塞了线程,我尝试了readLine()方法,阻塞了线程。

尝试之后,我使用了这个:

    public static void main(String[] args) throws IOException{
        Socket s = new Socket();
        String host = "";
        s.connect(new InetSocketAddress(host, 23));
        Response response = new Response(s);
        response .start();
        if(response .isInterrupted()){
            System.out.println(response .getSb().toString());
        }

    }
public class Response extends Thread {
    Socket s;
    BufferedReader s_in = null;
    InputStream in = null;
    private StringBuffer sb = new StringBuffer();
    public Response(Socket s){
        this.s = s;
    }
    @Override
    public void run() {
        try {
            s_in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            in = s.getInputStream();
            char ch;
            int i;

            while(!Thread.currentThread().isInterrupted()){
                i = s_in.read();
                ch = (char) i;
                System.out.print(ch);
                getSb().append(getSb());
            }
            System.out.print(getSb());
        } catch (IOException ex) {
            Logger.getLogger(Response.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public StringBuffer getSb() {
        return sb;
    }
}
public class Message extends Thread{
    Socket s;
    PrintWriter s_out = null;
    public Message(Socket s){
        this.s = s;
    }
    @Override
    public void run(){
        try {
            s_out = new PrintWriter(s.getOutputStream(), true);
        } catch (IOException ex) {
            Logger.getLogger(Message.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

但是当我运行应用程序时,套接字没有足够的时间将所有数据发送到InputStream。

因此,我可以验证流何时结束。开始阅读

我不知道为什么你不使用缓冲流,或者把这个读取器放在它自己的线程中,因为它应该总是从套接字读取(或准备读取),这意味着阻塞。

但是,对于您提供的代码,改善这种情况的最简单方法是读取,直到没有更多的字节可读,这不是您实际做的。在执行for循环时,可能会有更多的字节进来。试试这个:

int i;
char c;
while (in.available() > 0)
{
    i = s_in.read();
    System.out.print(ch = (char)i);
    sb.append(ch);
}

它真的不能解决你的问题,因为你没有用一个单独的线程缓冲你的输入,你仍然可以在收到你期望得到的所有数据之前退出循环。

相关内容

  • 没有找到相关文章

最新更新