簡體   English   中英

使用線程從InputStream讀取數據

[英]Read data from InputStream using Threads

我嘗試使用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);
}

它確實不能解決您的問題,因為您沒有使用單獨的線程來緩沖輸入,並且仍然可以在收到期望獲得的所有數據之前退出循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM