Ascultarea fluxului incoming în Thread folosind Java

Deci, în această etapă am un server și un client în care fiecare dintre ele are atât fluxul de intrare, cât și cel de ieșire.

Am implementat un streamer video folosind wrapper VLC. Practic, când aleg un videoclip pe client, acesta trimite un șir de obiecte pe care serverul ar trebui să le aștepte să le primească în continuare. (VideoFile/commentWrite/ratingWrite). Trimite toate aceste trei obiecte la alegerea unui videoclip, astfel încât să actualizeze fluxul, să actualizeze caseta de comentarii și caseta de evaluare.

Problema acum este că atunci când trebuie să trimit aceste antete și să primesc date trebuie să folosesc ceva de genul:

        replyToServer.writeObject("videoFile");
        replyToServer.writeObject(selectedVideo);       

        //get comments
        listening();

        //get rating
        listening();

Deci este greu de codificare, știind în față cunoașteți multe răspunsuri pe care le așteptați. Mai mult, dacă doriți să primiți ceva de la server în orice moment al activității dvs. pe client, nu puteți utiliza o singură buclă în timp ce verificați funcția de ascultare() deoarece aceasta va bloca toate celelalte funcționalități.

PS. ascultătorul este structurat astfel:

public void listening() throws IOException, ClassNotFoundException {
    String mode = null;
           //blocks the process till gets the output.
        mode =  (String) inputFromServer.readObject();
        System.out.println("Mode Received:" +mode);

    if (mode.equals("videoList")) {
        getListFromSocket();
    } else if [.....]

So... So I understood that it could be done by using threads. I haven't really done much threads using Java, but is it possible to make some kind of interrupt on (String) inputFromServer.readObject(); or inputFromServer.available() So as soon as it sees that there is something on the stream it jumps to the listening() function?

ACTUALIZAȚI:

prin utilizarea codului lxx am observat că excepția nulă pe care o primesc se datorează actualizării gui. Am o funcție de actualizareComentarii în care asculta() ;. Totul pare să funcționeze bine pe măsură ce văd comentariile etc. Dar, totuși, arată acele excepții nulă din consola ...

    public void updateComments(List commentList) {



    commentLabel.setText("<html><div style='width:130px; border: 1px solid black; list-style-type: none; text-align:left;'>");
    if (commentList.size() == 0) {

         commentLabel.setText(commentLabel.getText()+"No comments...
"); } else { for (Comment tempComment : commentList) { commentLabel.setText(commentLabel.getText()+"<div style='margin:3px;'>"+tempComment.getUser()+":
"); commentLabel.setText(commentLabel.getText()+""+tempComment.getText()+"
"); commentLabel.setText(commentLabel.getText()+""+tempComment.getDate()+"</div>

");
    }


    }
     commentLabel.setText(commentLabel.getText()+"</div></html>");

}
0

1 răspunsuri

De ce nu puneți ascultarea() sau o buclă care sună la ascultarea (operațiile de blocare) într-un Thread:

new Thread(new Runnable() {

    @Override
    public void run() {
        listening();

    }

}).start();

În acest fel, operațiile de blocare se află într-un fir separat și codul dvs. principal continuă să execute în mod normal.

0
adăugat
Am scris că poți folosi o buclă. Excepțiile nu sunt probabil cauzate de fir. Verificați ce obiect este nul și de ce.
adăugat autor Ixx, sursa
Verificați, de asemenea, că nu încercați să utilizați datele pe care le inițializați în firul imediat după ce ați pornit-o. S-ar putea să încercați să accesați date care încă nu au fost inițializate.
adăugat autor Ixx, sursa
Cu codul furnizat, acesta ascultă doar o singură dată. Așa că am încercat să adaug o buclă (adevărată). Nu arată multe erori. (Excepție în firul "AWT-EventQueue-0" java.lang.NullPointerException)
adăugat autor Arturs Vancans, sursa
Oh. Scuze. N-ai observat că ai scris. Voi reveni din nou la cod.
adăugat autor Arturs Vancans, sursa