J'exécute un code java client-serveur sur ma machine locale et je les connecte en utilisant des sockets java.java.net.SocketException: Connexion Réinitialiser
Je peux connecter le client au serveur et envoyer une chaîne de données, initialement. Lorsque le serveur reçoit les données, il renvoie une chaîne au début. Après cette communication, tout se bloque. Aucune réponse des deux côtés. J'utilise une interface graphique javafx n les données renvoyées par le serveur sont censées déclencher une action (insérer des nœuds dans l'étape javafx). J'ai un observable pour ça. Mais même sans les trucs javafx, le client se bloque après avoir reçu des données du serveur (il les reçoit réellement). Cela a quelque chose à voir avec les flux d'entrée/sortie.
Apparemment, beaucoup de gens ont eu ce problème mais personne n'envoie de solutions. Oh, j'ai désactivé mon pare-feu.
Qu'est-ce qui réinitialise la connexion? Serait-ce le javafx? Je ne suis pas très bon. Une autre chose, j'utilise une classe java séparée (autre que la classe javafx) pour se connecter. La classe javafx crée un objet qui gère la connexion. Donc j'appelle juste des méthodes (par exemple streamFromServer qui écoute le flux d'entrée du socket). Ce n'est que lorsque j'appelle cette méthode que le client plante, c'est comme ça que je sais qu'il a quelque chose à voir avec les flux d'entrée/sortie.
j'ai pu résoudre le problème, l'exécution côté client était suspendu par une boucle while, comme ci-dessous:
try{
String ins;
while((ins = (String)in.readObject()) != null){
//do something with the data read in.
//'in' is an ObjectInputStream bound to a client socket
}
} catch(Exception e){
e.printStackTrace();
}
La boucle while liée à l'exécution au niveau du client et donc le Le programme ne pouvait pas aller au-delà de ce point, donc étant l'utilisateur ignorant je supposais que le programme s'était écrasé.
Je me suis occupé en créant une nouvelle classe qui implémente runnable et la création d'un fil à l'intérieur, qui vérifie le flux d'entrée au lieu du principal programme client, comme ceci:
try{
in = new ObjectInputStream(clientSocket.getInputStream());
listenerThread = new StreamListener(in);
} catch(Exception e){
e.printStackTrace();
}
Et la StreamListener Classe:
import java.io.ObjectInputStream;
import java.util.Observable;
public class StreamListener extends Observable implements Runnable{
private ObjectInputStream in = null;
public String[] bubbles = null;
private boolean connectionOpen = true;
public StreamListener(ObjectInputStream in){
this.in = in;
Thread t = new Thread(this);
t.start();
}
@Override
public void run(){
while(connectionOpen){
try{
String ins;
while((ins = (String)in.readObject()) != null){
System.out.println("Received: " + ins);
if(ins.equals("noInitial")){
System.out.println("Reply of no initial from server, I must be the first to connect");
}
if(ins.contains("initial#")){
initiateBubbles(ins.substring(8));
}
if(ins.contains("new#")){
int index = bubbles.length;
String s = ins.substring(4);
bubbles[index] = s;
}
if(ins.contains("drag#")){
String s = ins.substring(5), owner = s.substring(0,s.indexOf("#")), x = "", y = "";
String coordinates = s.substring(s.indexOf("#") + 1);
for(int i = 0; i < coordinates.length(); i++){
if(coordinates.charAt(i) == '#'){
x = coordinates.substring(0, i);
y = coordinates.substring(i + 1, coordinates.length() - 1);
}
}
String[] str;
for(int i = 0; i < bubbles.length; i++){
str = bubbles[i].split("#");
if(str[0].equals(owner)){
str[2] = x;
str[3] = y;
}
}
}
continue;
}
} catch(Exception e){
connectionOpen = false;
System.err.println("Could not receive bubble data from server: " + e.toString());
}
}
}
public String[] getBubbles(){
return bubbles;
}
public void initiateBubbles(String s){
bubbles = s.split("@");
System.out.println("Bubbles initialised");
fireNotify();
}
public void moveBubble(String s){
fireNotify(s);
}
public void fireNotify(){
setChanged();
notifyObservers();
System.out.println("Observer notified");
}
public void fireNotify(String s){
setChanged();
notifyObservers(s);
System.out.println("Observer notified");
}
public void close(){
connectionOpen = false;
try{
in.close();
} catch(Exception e) {
System.err.println("Could not close listener thread: " + e.toString());
}
}
}
Et Voila !! Cela m'amène à ma question suivante, d'une façon ou d'une autre, l'observateur n'est pas averti. Quelqu'un pourrait-il me dire pourquoi? Voici la classe Observateur JavaFX:
import java.util.Observable;
import java.util.Observer;
import java.lang.System;
public class BubbleAdapter extends Observer{
public-read var bubbles : Bubble[];
public-read var bubblesInitialised : Boolean = false;
public-read var bubbleString : String[];
public-init var connector : StreamListener
on replace {connector.addObserver(this)};
override function update(observable : Observable, arg : Object){
FX.deferAction(
function() : Void {
System.out.println("Observer called");
if(arg == null){
bubbleString = connector.getBubbles();
var str : String[];
for(i in [0..sizeof bubbleString]){
if(bubbleString[i].contains("#")){
str = bubbleString[i].split("#");
bubbles[i] = Bubble {
name : bind str[0]
time : bind str[1]
translateX : bind Float.parseFloat(str[2])
translateY : bind Float.parseFloat(str[3])
}
//insert bubble after Main.stage.scene.content[Main.currentIndex++];
}
}
bubblesInitialised = true;
}
else if(arg instanceof String){
}
}
);
}
}
Ne vous préoccupez pas gritties Nitty, cet observateur est d'abord censé imprimer « Observer appelé », qui ne se produit pas. Encore une fois, aidez s'il vous plaît.
Si vous ne montrez pas de code lié au socket, je doute que quiconque puisse pointer vers une erreur dans ce code. Outre; comme vous l'avez mentionné un accident, vous devriez avoir une pile. S'il ne répond plus, il se peut que vous ne lisiez pas le tampon (il n'y a plus de place pour recevoir) ou que vous essayez de lire un tampon vide. Sans code, il est difficile de voir une cause. – extraneon