kajur64 | Bonjour, je vient vers vous car j'ai un soucis avec mon code java que je n'arrive pas à élucider.
C'est un code qui permet de faire un réseau client/serveur avec comme client as3 et le serveur en java.
Le soucis vient de facon aléatoire dans le temps mais toujours au meme endroit dans le code.
Voici en premier le code as3 :
Code :
- var xmlSocket:XMLSocket = new XMLSocket();
- xmlSocket.addEventListener(Event.CONNECT , onConnected);
- xmlSocket.connect("1.2.3.4",5678);
- function onConnected(evt:Event)
- { xmlSocket.send("intel~est connecté(e)" );
- trace("connection = ok" );
- }
|
Puis le code lancement serveur:
Code :
- package xsocketchatserver;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileWriter;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.xsocket.connection.*;
- public class XSocketChatServer
- { protected static IServer srv = null;
-
- // code servant a ecrire dans le fichier log
- static BufferedWriter bw = null;
- // code servant a ecrire dans le fichier log
-
- public static void main(String[] args)
- { try
- { // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : main<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- srv = new Server(5678, new xSocketDataHandler());
- srv.run();
- }
- catch(Exception ex)
- { System.out.println(ex.getMessage());
- }
- }
- protected static void shutdownServer()
- { try
- { // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : shutdownServer<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- srv.close();
- }
- catch(Exception ex)
- { System.out.println(ex.getMessage());
- }
- }
- }
|
Puis le code qui traite les connections :
Code :
- package xsocketchatserver;
- import java.io.IOException;
- import java.nio.BufferOverflowException;
- import java.nio.BufferUnderflowException;
- import java.nio.channels.ClosedChannelException;
- import java.util.*;
- import org.xsocket.*;
- import org.xsocket.connection.*;
- // code servant a ecrire dans le fichier log
- import java.io.File;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.net.InetAddress;
- import java.net.NetworkInterface;
- import java.text.SimpleDateFormat;
- // code servant a ecrire dans le fichier log
- public class xSocketDataHandler implements IDataHandler, IConnectHandler, IDisconnectHandler
- { private Set<INonBlockingConnection> sessions = Collections.synchronizedSet(new HashSet<INonBlockingConnection>());
-
- // code servant a ecrire dans le fichier log
- static BufferedWriter bw = null;
- // code servant a ecrire dans le fichier log
-
- public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException
- { // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : Incoming data A : "+nbc.getRemoteAddress()+"<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- try
- { String data = nbc.readStringByDelimiter("\0" );
-
- // code servant a ecrire dans le fichier log
- String contentA = monHeure + " : Incoming data B: " + data + " : "+nbc.getRemoteAddress()+"<br/>";
- File fileA =new File("logChat.txt" );
- if(!fileA.exists()){fileA.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileA,true));
- bw.write(contentA);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- if(data.trim().length() > 0)
- { //System.out.println("Incoming data : " + data);
-
- // code servant a ecrire dans le fichier log
- String contentB = monHeure + " : Incoming data C: " + data + " : "+nbc.getRemoteAddress()+"<br/>";
- File fileB =new File("logChat.txt" );
- if(!fileB.exists()){fileB.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileB,true));
- bw.write(contentB);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- if(data.equalsIgnoreCase("<policy-file-request/>" ))
- { nbc.write("<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"5678\"/></cross-domain-policy>\0" );
- nbc.flush();
- return true;
- }
- String[] message = data.split("~" );
-
- // code servant a ecrire dans le fichier log
- String contentC = monHeure + " : Incoming data D: " + message + " : "+nbc.getRemoteAddress()+"<br/>";
- File fileC =new File("logChat.txt" );
- if(!fileC.exists()){fileC.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileC,true));
- bw.write(contentC);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- sendMessageToAll(message[0], message[1]);
- if(message[1].equalsIgnoreCase("chutagobyfubewigoluka" ))
- { XSocketChatServer a = new XSocketChatServer();
- a.shutdownServer();
- }
- }
- }
- catch(IOException | BufferOverflowException ex)
- { //System.out.println("onData: " + ex.getMessage());
-
- // code servant a ecrire dans le fichier log
- String contentD = monHeure + " : Incoming data error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
- File fileD =new File("logChat.txt" );
- if(!fileD.exists()){fileD.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileD,true));
- bw.write(contentD);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- return true;
- }
- private void sendMessageToAll(String user, String message) throws IOException
- { // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : Outgoing data : <b>" + user + "</b>: " + message + "<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- try
- { synchronized(sessions)
- { Iterator<INonBlockingConnection> iter = sessions.iterator();
-
- // code servant a ecrire dans le fichier log
- String contentC = monHeure + " : Outgoing data A : <b>" + user + "</b>: " + message + "<br/>";
- File fileC =new File("logChat.txt" );
- if(!fileC.exists()){fileC.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileC,true));
- bw.write(contentC);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- while(iter.hasNext())
- { INonBlockingConnection nbConn = (INonBlockingConnection) iter.next();
- if(nbConn.isOpen())
- { nbConn.write("<b>" + user + "</b>: " + message + "<br />\0" );
- nbConn.flush();
- }
- }
- }
- //System.out.println("Outgoing data: <b>" + user + "</b>: " + message + "<br />\0" );
-
- // code servant a ecrire dans le fichier log
- String contentA = monHeure + " : Outgoing data B : <b>" + user + "</b>: " + message + "<br/>";
- File fileA =new File("logChat.txt" );
- if(!fileA.exists()){fileA.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileA,true));
- bw.write(contentA);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- catch(IOException | BufferOverflowException ex)
- { //System.out.println("sendMessageToAll: " + ex.getMessage());
-
- // code servant a ecrire dans le fichier log
- String contentB = monHeure + " : Outgoing data error : " + ex.getMessage() + "<br/>";
- File fileB =new File("filename.txt" );
- if(!fileB.exists()){fileB.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileB,true));
- bw.write(contentB);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- }
-
- public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException
- { // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : onConnect : "+nbc.getRemoteAddress()+"<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- try
- { // code servant a ecrire dans le fichier log
- String contentA = monHeure + " : onConnect A : "+nbc.getRemoteAddress()+"<br/>";
- File fileA =new File("logChat.txt" );
- if(!fileA.exists()){fileA.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileA,true));
- bw.write(contentA);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- synchronized(sessions)
- {
- // code servant a ecrire dans le fichier log
- String contentB = monHeure + " : onConnect B : "+nbc.getRemoteAddress()+"<br/>";
- File fileB =new File("logChat.txt" );
- if(!fileB.exists()){fileB.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileB,true));
- bw.write(contentB);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
-
- sessions.add(nbc);
- }
- //System.out.println("onConnect" );
-
- // code servant a ecrire dans le fichier log
- String contentC = monHeure + " : onConnect C : "+nbc.getRemoteAddress()+"<br/>";
- File fileC =new File("logChat.txt" );
- if(!fileC.exists()){fileC.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileC,true));
- bw.write(contentC);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- catch(Exception ex)
- { //System.out.println("onConnect: " + ex.getMessage());
-
- // code servant a ecrire dans le fichier log
- String contentD = monHeure + " : onConnect error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
- File fileD =new File("logChat.txt" );
- if(!fileD.exists()){fileD.createNewFile();}
- bw = new BufferedWriter(new FileWriter(fileD,true));
- bw.write(contentD);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- return true;
- }
- public boolean onDisconnect(INonBlockingConnection nbc) throws IOException
- { try
- { synchronized(sessions)
- {
- sessions.remove(nbc);
- }
- //System.out.println("onDisconnect" );
-
- // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : onDisconnect : "+nbc.getRemoteAddress()+"<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- catch(Exception ex)
- { //System.out.println("onDisconnect: " + ex.getMessage());
-
- // code servant a ecrire dans le fichier log
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
- String monHeure = sdf.format(new Date());
- String content = monHeure + " : onDisconnect error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
- File file =new File("logChat.txt" );
- if(!file.exists()){file.createNewFile();}
- bw = new BufferedWriter(new FileWriter(file,true));
- bw.write(content);//Start writing to the output stream
- bw.flush();
- bw.close();
- // code servant a ecrire dans le fichier log
- }
- return true;
- }
- }
|
Et enfin le fichier log :
Code :
- 22:19:41 : onConnect : /5.4.3.2
- 22:19:41 : onConnect A : /5.4.3.2
- 22:19:41 : onConnect B : /5.4.3.2
- 22:19:41 : onConnect C : /5.4.3.2
- 22:19:41 : Incoming data A : /5.4.3.2
- 22:19:41 : Incoming data B: YYY~est connecté(e) : /5.4.3.2
- 22:19:41 : Incoming data C: YYY~est connecté(e) : /5.4.3.2
- 22:19:41 : Incoming data D: [Ljava.lang.String;@2350ad83 : /5.4.3.2
- 22:19:41 : Outgoing data : YYY: est connecté(e)
- 22:19:41 : Outgoing data A : YYY: est connecté(e)
- 22:19:41 : Outgoing data B : YYY: est connecté(e)
- 22:20:03 : onConnect : /9.8.7.6
- 22:20:03 : onConnect A : /9.8.7.6
- 22:20:03 : onConnect B : /9.8.7.6
- 22:20:03 : onConnect C : /9.8.7.6
- 22:20:03 : Incoming data A : /9.8.7.6
- 22:20:03 : Incoming data B: XXX~est connecté(e) : /9.8.7.6
- 22:20:03 : Incoming data C: XXX~est connecté(e) : /9.8.7.6
- 22:20:03 : Incoming data D: [Ljava.lang.String;@7224ccce : /9.8.7.6
- 22:20:03 : Outgoing data : XXX: est connecté(e)
- 22:20:03 : Outgoing data A : XXX: est connecté(e)
- 22:20:03 : Outgoing data B : XXX: est connecté(e)
- 22:20:26 : Incoming data A : /9.8.7.6
- 22:20:26 : Incoming data B: XXX~Je te vois YYY! : /9.8.7.6
- 22:20:26 : Incoming data C: XXX~Je te vois YYY! : /9.8.7.6
- 22:20:26 : Incoming data D: [Ljava.lang.String;@6e431d9d : /9.8.7.6
- 22:20:26 : Outgoing data : XXX: Je te vois YYY!
- 22:20:26 : Outgoing data A : XXX: Je te vois YYY!
- 22:20:26 : Outgoing data B : XXX: Je te vois YYY!
- 22:21:04 : Incoming data A : /5.4.3.2
- 22:21:04 : Incoming data B: YYY~Moi aussi ! : /5.4.3.2
- 22:21:04 : Incoming data C: YYY~Moi aussi ! : /5.4.3.2
- 22:21:04 : Incoming data D: [Ljava.lang.String;@6d552524 : /5.4.3.2
- 22:21:04 : Outgoing data : YYY: Moi aussi !
- 22:21:04 : Outgoing data A : YYY: Moi aussi !
- 22:21:04 : Outgoing data B : YYY: Moi aussi !
- 22:22:47 : Incoming data A : /5.4.3.2
- 22:22:47 : Incoming data B: YYY~je viens de partir !! : /5.4.3.2
- 22:22:47 : Incoming data C: YYY~je viens de partir !! : /5.4.3.2
- 22:22:47 : Incoming data D: [Ljava.lang.String;@41796abe : /5.4.3.2
- 22:22:47 : Outgoing data : YYY: je viens de partir !!
- 22:22:47 : Outgoing data A : YYY: je viens de partir !!
- 22:24:30 : onConnect : /5.4.3.2
- 22:24:30 : onConnect A : /5.4.3.2
|
Le probleme survient à 22:24:30 lorsque l'ip 5.4.3.2 tente de se connecter, la connection s'etablit correctement comme on peut le voir dans les log et dans le trace dans le fichier as3 mais bloque au niveau du synchronized(sessions){} dans la fonction public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException.
Lorsque cela arrive, tout le systeme du d'echange de message du tchat est planté, je suis obligé de kill le processus (le serveur java etant sur une debian) et de le relancer. Cela provient au bout de 30 min ou au bout de 5h, qu'il y ai 10 ou 80 personnes dessus.
N'etant pas dev java de base, il y a surement une erreur dedans mais je ne la voit pas. Merci pour vos futures réponses. |