Juste pour être complètement transparent, ceci est pour une affectation.Buffered Reader pour une socket n'est jamais prêt
Il y a plus à faire, mais pour le moment je suis juste essayer d'obtenir ce qui suit:
- Noeud A lit depuis un fichier texte
- nœud A envoie un fichier texte (moins le premier ligne) pour le noeud B en utilisant une douille
- Node B lue à partir de ladite douille, et l'affiche sur la console à
Toutefois, dès maintenant, il semble que ce soit l'information est en cours d'envoi, ou ça ne se lit pas corre cte par le nœud B.
Dans ma classe principale, je mis en place les nœuds comme celui-ci:
NodeA nodeA = new NodeA();
NodeB nodeB = new NodeB();
new Thread(nodeA).start();
new Thread(nodeB).start();
Dans le nœud A, je fais ceci:
//Open a socket for talking with NodeB
Socket mySocket = new Socket(InetAddress.getLocalHost(), portNum);
//Set up the socket's output
PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true);
//Loop through the lines of the confA file, writing them to the socket
String line = bufferedReader.readLine();
while (line != null)
{
//Write the line to the socket, get the next line
out.println(line); //updated to println, this flushes and fixes another problem
out.flush();
line = bufferedReader.readLine();
}
//Close the socket
mySocket.close();
Notez que les travaux de boucle de noeud A bien. Il ne boucle pas toujours et passe par les lignes de texte prévues lorsque j'ai testé avec des instructions d'impression.
Puis, sur la fin du noeud B: Mise à jour pour afficher du code actuel Node B
//Open the socket
ServerSocket mySocket = new ServerSocket(portNum);
Socket connectionSocket = mySocket.accept();
//Set up a reader on the socket to get what's coming from it
BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
String line = in.readLine(); //hang occurs here
while(line != null) {
System.out.println(line);
line = in.readLine();;
}
Cependant, in.ready() est jamais vrai. J'ai essayé d'attendre que cela se produise en utilisant une boucle while mais cela n'arrive jamais.
Je ne sais vraiment pas pourquoi. Je n'ai aucune idée si je configure correctement le socket, si j'installe le serveur correctement, si j'écoute correctement, etc.
Je viens de penser que faire B dans un serveur qui écoute A a fait le plus de sens . J'espère que c'est vrai. Cela ressemble à ce que j'ai vu d'autres exemples sur SO.
Merci pour toute l'aide. Je suis extrêmement familier avec les prises, les ports, l'écoute et d'autres, alors pardonnez-moi si je ne comprends pas vos suggestions au début. Je ferai de mon mieux pour le comprendre au fur et à mesure. Je me suis abstenu d'ajouter tout le code pour rendre le code plus lisible et plus clair, mais si vous avez besoin de plus d'informations n'hésitez pas à demander et je ferai de mon mieux pour vous le fournir.
1) Chaque fois que 'ServerSocket.accept()' renvoie, une socket connectée est établie entre le serveur et le client. Pour * cette * connexion, vous ne devez pas appeler 'ServerSocket.accept()' à nouveau. 2) Dans votre client, PrintWriter tamponne les données en interne. Si vous voulez que le résultat de l'appel 'out.print (line);' soit immédiatement visible sur le réseau, vous devez appeler 'out.flush()' comme instruction suivante. –
Tout 'ready()' est retourné si la lecture suivante retournera immédiatement. Voir [la documentation] (https://docs.oracle.com/javase/9/docs/api/java/io/Reader.html#ready--). – VGR