synchronized java

synchronized java - Java - Programmation

Marsh Posté le 23-01-2013 à 09:57:47    

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 :
  1. var xmlSocket:XMLSocket = new XMLSocket();
  2. xmlSocket.addEventListener(Event.CONNECT , onConnected);
  3. xmlSocket.connect("1.2.3.4",5678);
  4. function onConnected(evt:Event)
  5. { xmlSocket.send("intel~est connecté(e)" );
  6. trace("connection = ok" );
  7. }


 
Puis le code lancement serveur:  

Code :
  1. package xsocketchatserver;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import org.xsocket.connection.*;
  8. public class XSocketChatServer
  9. {   protected static IServer srv = null;
  10.    
  11.     // code servant a ecrire dans le fichier log
  12.     static BufferedWriter bw = null;
  13.     // code servant a ecrire dans le fichier log
  14.    
  15.     public static void main(String[] args)
  16.     {   try
  17.         {   // code servant a ecrire dans le fichier log
  18.             SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  19.             String monHeure = sdf.format(new Date());
  20.             String content = monHeure + " : main<br/>";
  21.             File file =new File("logChat.txt" );
  22.             if(!file.exists()){file.createNewFile();}
  23.             bw = new BufferedWriter(new FileWriter(file,true));
  24.             bw.write(content);
  25.             bw.flush();
  26.             bw.close();
  27.             // code servant a ecrire dans le fichier log
  28.            
  29.             srv = new Server(5678, new xSocketDataHandler());
  30.             srv.run();
  31.         }
  32.         catch(Exception ex)
  33.         {   System.out.println(ex.getMessage());
  34.         }
  35.     }
  36.     protected static void shutdownServer()
  37.     {   try
  38.         {   // code servant a ecrire dans le fichier log
  39.             SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  40.             String monHeure = sdf.format(new Date());
  41.             String content = monHeure + " : shutdownServer<br/>";
  42.             File file =new File("logChat.txt" );
  43.             if(!file.exists()){file.createNewFile();}
  44.             bw = new BufferedWriter(new FileWriter(file,true));
  45.             bw.write(content);
  46.             bw.flush();
  47.             bw.close();
  48.             // code servant a ecrire dans le fichier log
  49.                
  50.             srv.close();
  51.         }
  52.         catch(Exception ex)
  53.         {   System.out.println(ex.getMessage());
  54.         }
  55.     }
  56. }


 
Puis le code qui traite les connections :  

Code :
  1. package xsocketchatserver;
  2. import java.io.IOException;
  3. import java.nio.BufferOverflowException;
  4. import java.nio.BufferUnderflowException;
  5. import java.nio.channels.ClosedChannelException;
  6. import java.util.*;
  7. import org.xsocket.*;
  8. import org.xsocket.connection.*;
  9. // code servant a ecrire dans le fichier log
  10. import java.io.File;
  11. import java.io.BufferedWriter;
  12. import java.io.FileWriter;
  13. import java.net.InetAddress;
  14. import java.net.NetworkInterface;
  15. import java.text.SimpleDateFormat;
  16. // code servant a ecrire dans le fichier log
  17. public class xSocketDataHandler implements IDataHandler, IConnectHandler, IDisconnectHandler
  18. {   private Set<INonBlockingConnection> sessions = Collections.synchronizedSet(new HashSet<INonBlockingConnection>());
  19.    
  20.     // code servant a ecrire dans le fichier log
  21.     static BufferedWriter bw = null;
  22.     // code servant a ecrire dans le fichier log
  23.    
  24.     public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException
  25.     {   // code servant a ecrire dans le fichier log
  26.         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  27.         String monHeure = sdf.format(new Date());
  28.         String content = monHeure + " : Incoming data A : "+nbc.getRemoteAddress()+"<br/>";
  29.         File file =new File("logChat.txt" );
  30.         if(!file.exists()){file.createNewFile();}
  31.         bw = new BufferedWriter(new FileWriter(file,true));
  32.         bw.write(content);//Start writing to the output stream
  33.         bw.flush();
  34.         bw.close();
  35.         // code servant a ecrire dans le fichier log
  36.                
  37.         try
  38.         {   String data = nbc.readStringByDelimiter("\0" );
  39.            
  40.             // code servant a ecrire dans le fichier log
  41.             String contentA = monHeure + " : Incoming data B: " + data + " : "+nbc.getRemoteAddress()+"<br/>";
  42.             File fileA =new File("logChat.txt" );
  43.             if(!fileA.exists()){fileA.createNewFile();}
  44.             bw = new BufferedWriter(new FileWriter(fileA,true));
  45.             bw.write(contentA);//Start writing to the output stream
  46.             bw.flush();
  47.             bw.close();
  48.             // code servant a ecrire dans le fichier log
  49.                
  50.             if(data.trim().length() > 0)
  51.             {   //System.out.println("Incoming data : " + data);
  52.                
  53.                 // code servant a ecrire dans le fichier log
  54.                 String contentB = monHeure + " : Incoming data C: " + data + " : "+nbc.getRemoteAddress()+"<br/>";
  55.                 File fileB =new File("logChat.txt" );
  56.                 if(!fileB.exists()){fileB.createNewFile();}
  57.                 bw = new BufferedWriter(new FileWriter(fileB,true));
  58.                 bw.write(contentB);//Start writing to the output stream
  59.                 bw.flush();
  60.                 bw.close();
  61.                 // code servant a ecrire dans le fichier log
  62.          
  63.                 if(data.equalsIgnoreCase("<policy-file-request/>" ))
  64.                 {   nbc.write("<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"5678\"/></cross-domain-policy>\0" );
  65.                     nbc.flush();
  66.                     return true;
  67.                 }
  68.                 String[] message = data.split("~" );
  69.                
  70.                 // code servant a ecrire dans le fichier log
  71.                 String contentC = monHeure + " : Incoming data D: " + message + " : "+nbc.getRemoteAddress()+"<br/>";
  72.                 File fileC =new File("logChat.txt" );
  73.                 if(!fileC.exists()){fileC.createNewFile();}
  74.                 bw = new BufferedWriter(new FileWriter(fileC,true));
  75.                 bw.write(contentC);//Start writing to the output stream
  76.                 bw.flush();
  77.                 bw.close();
  78.                 // code servant a ecrire dans le fichier log
  79.                
  80.                 sendMessageToAll(message[0], message[1]);
  81.                 if(message[1].equalsIgnoreCase("chutagobyfubewigoluka" ))
  82.                 {   XSocketChatServer a = new XSocketChatServer();
  83.                     a.shutdownServer();
  84.                 }
  85.             }
  86.         }
  87.         catch(IOException | BufferOverflowException ex)
  88.         {   //System.out.println("onData: " + ex.getMessage());
  89.            
  90.             // code servant a ecrire dans le fichier log
  91.             String contentD = monHeure + " : Incoming data error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
  92.             File fileD =new File("logChat.txt" );
  93.             if(!fileD.exists()){fileD.createNewFile();}
  94.             bw = new BufferedWriter(new FileWriter(fileD,true));
  95.             bw.write(contentD);//Start writing to the output stream
  96.             bw.flush();
  97.             bw.close();
  98.             // code servant a ecrire dans le fichier log
  99.         }
  100.         return true;
  101.     }
  102.     private void sendMessageToAll(String user, String message) throws IOException
  103.     {   // code servant a ecrire dans le fichier log
  104.         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  105.         String monHeure = sdf.format(new Date());
  106.         String content = monHeure + " : Outgoing data : <b>" + user + "</b>: " + message + "<br/>";
  107.         File file =new File("logChat.txt" );
  108.         if(!file.exists()){file.createNewFile();}
  109.         bw = new BufferedWriter(new FileWriter(file,true));
  110.         bw.write(content);//Start writing to the output stream
  111.         bw.flush();
  112.         bw.close();
  113.         // code servant a ecrire dans le fichier log
  114.            
  115.         try
  116.         {   synchronized(sessions)
  117.             {   Iterator<INonBlockingConnection> iter = sessions.iterator();
  118.                
  119.                 // code servant a ecrire dans le fichier log
  120.                 String contentC = monHeure + " : Outgoing data A : <b>" + user + "</b>: " + message + "<br/>";
  121.                 File fileC =new File("logChat.txt" );
  122.                 if(!fileC.exists()){fileC.createNewFile();}
  123.                 bw = new BufferedWriter(new FileWriter(fileC,true));
  124.                 bw.write(contentC);//Start writing to the output stream
  125.                 bw.flush();
  126.                 bw.close();
  127.                 // code servant a ecrire dans le fichier log
  128.            
  129.                 while(iter.hasNext())
  130.                 {   INonBlockingConnection nbConn = (INonBlockingConnection) iter.next();
  131.                     if(nbConn.isOpen())
  132.                     {   nbConn.write("<b>" + user + "</b>: " + message + "<br />\0" );
  133.                         nbConn.flush();
  134.                     }
  135.                 }
  136.             }
  137.             //System.out.println("Outgoing data: <b>" + user + "</b>: " + message + "<br />\0" );
  138.            
  139.             // code servant a ecrire dans le fichier log
  140.             String contentA = monHeure + " : Outgoing data B : <b>" + user + "</b>: " + message + "<br/>";
  141.             File fileA =new File("logChat.txt" );
  142.             if(!fileA.exists()){fileA.createNewFile();}
  143.             bw = new BufferedWriter(new FileWriter(fileA,true));
  144.             bw.write(contentA);//Start writing to the output stream
  145.             bw.flush();
  146.             bw.close();
  147.             // code servant a ecrire dans le fichier log
  148.         }
  149.         catch(IOException | BufferOverflowException ex)
  150.         {   //System.out.println("sendMessageToAll: " + ex.getMessage());
  151.            
  152.             // code servant a ecrire dans le fichier log
  153.             String contentB = monHeure + " : Outgoing data error : " + ex.getMessage() + "<br/>";
  154.             File fileB =new File("filename.txt" );
  155.             if(!fileB.exists()){fileB.createNewFile();}
  156.             bw = new BufferedWriter(new FileWriter(fileB,true));
  157.             bw.write(contentB);//Start writing to the output stream
  158.             bw.flush();
  159.             bw.close();
  160.             // code servant a ecrire dans le fichier log
  161.         }
  162.     }
  163.    
  164.     public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException
  165.     {   // code servant a ecrire dans le fichier log
  166.         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  167.         String monHeure = sdf.format(new Date());
  168.         String content = monHeure + " : onConnect : "+nbc.getRemoteAddress()+"<br/>";
  169.         File file =new File("logChat.txt" );
  170.         if(!file.exists()){file.createNewFile();}
  171.         bw = new BufferedWriter(new FileWriter(file,true));
  172.         bw.write(content);//Start writing to the output stream
  173.         bw.flush();
  174.         bw.close();
  175.         // code servant a ecrire dans le fichier log
  176.            
  177.         try
  178.         {   // code servant a ecrire dans le fichier log
  179.             String contentA = monHeure + " : onConnect A : "+nbc.getRemoteAddress()+"<br/>";
  180.             File fileA =new File("logChat.txt" );
  181.             if(!fileA.exists()){fileA.createNewFile();}
  182.             bw = new BufferedWriter(new FileWriter(fileA,true));
  183.             bw.write(contentA);//Start writing to the output stream
  184.             bw.flush();
  185.             bw.close();
  186.             // code servant a ecrire dans le fichier log
  187.            
  188.             synchronized(sessions)
  189.             { 
  190.                 // code servant a ecrire dans le fichier log
  191.                 String contentB = monHeure + " : onConnect B : "+nbc.getRemoteAddress()+"<br/>";
  192.                 File fileB =new File("logChat.txt" );
  193.                 if(!fileB.exists()){fileB.createNewFile();}
  194.                 bw = new BufferedWriter(new FileWriter(fileB,true));
  195.                 bw.write(contentB);//Start writing to the output stream
  196.                 bw.flush();
  197.                 bw.close();
  198.                 // code servant a ecrire dans le fichier log
  199.                
  200.                 sessions.add(nbc);
  201.             }
  202.             //System.out.println("onConnect" );
  203.          
  204.             // code servant a ecrire dans le fichier log
  205.             String contentC = monHeure + " : onConnect C : "+nbc.getRemoteAddress()+"<br/>";
  206.             File fileC =new File("logChat.txt" );
  207.             if(!fileC.exists()){fileC.createNewFile();}
  208.             bw = new BufferedWriter(new FileWriter(fileC,true));
  209.             bw.write(contentC);//Start writing to the output stream
  210.             bw.flush();
  211.             bw.close();
  212.             // code servant a ecrire dans le fichier log
  213.         }
  214.         catch(Exception ex)
  215.         {   //System.out.println("onConnect: " + ex.getMessage());
  216.            
  217.             // code servant a ecrire dans le fichier log
  218.             String contentD = monHeure + " : onConnect error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
  219.             File fileD =new File("logChat.txt" );
  220.             if(!fileD.exists()){fileD.createNewFile();}
  221.             bw = new BufferedWriter(new FileWriter(fileD,true));
  222.             bw.write(contentD);//Start writing to the output stream
  223.             bw.flush();
  224.             bw.close();
  225.             // code servant a ecrire dans le fichier log
  226.         }
  227.         return true;
  228.     }
  229.     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException
  230.     {   try
  231.         {   synchronized(sessions)
  232.             {
  233.                 sessions.remove(nbc);
  234.             }
  235.             //System.out.println("onDisconnect" );
  236.            
  237.             // code servant a ecrire dans le fichier log
  238.             SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  239.             String monHeure = sdf.format(new Date());
  240.             String content = monHeure + " : onDisconnect : "+nbc.getRemoteAddress()+"<br/>";
  241.             File file =new File("logChat.txt" );
  242.             if(!file.exists()){file.createNewFile();}
  243.             bw = new BufferedWriter(new FileWriter(file,true));
  244.             bw.write(content);//Start writing to the output stream
  245.             bw.flush();
  246.             bw.close();
  247.             // code servant a ecrire dans le fichier log
  248.         }
  249.         catch(Exception ex)
  250.         {   //System.out.println("onDisconnect: " + ex.getMessage());
  251.            
  252.             // code servant a ecrire dans le fichier log
  253.             SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss" );
  254.             String monHeure = sdf.format(new Date());
  255.             String content = monHeure + " : onDisconnect error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
  256.             File file =new File("logChat.txt" );
  257.             if(!file.exists()){file.createNewFile();}
  258.             bw = new BufferedWriter(new FileWriter(file,true));
  259.             bw.write(content);//Start writing to the output stream
  260.             bw.flush();
  261.             bw.close();
  262.             // code servant a ecrire dans le fichier log
  263.         }
  264.         return true;
  265.     }
  266. }


 
Et enfin le fichier log :  

Code :
  1. 22:19:41 : onConnect : /5.4.3.2
  2. 22:19:41 : onConnect A : /5.4.3.2
  3. 22:19:41 : onConnect B : /5.4.3.2
  4. 22:19:41 : onConnect C : /5.4.3.2
  5. 22:19:41 : Incoming data A : /5.4.3.2
  6. 22:19:41 : Incoming data B: YYY~est connecté(e) : /5.4.3.2
  7. 22:19:41 : Incoming data C: YYY~est connecté(e) : /5.4.3.2
  8. 22:19:41 : Incoming data D: [Ljava.lang.String;@2350ad83 : /5.4.3.2
  9. 22:19:41 : Outgoing data : YYY: est connecté(e)
  10. 22:19:41 : Outgoing data A : YYY: est connecté(e)
  11. 22:19:41 : Outgoing data B : YYY: est connecté(e)
  12. 22:20:03 : onConnect : /9.8.7.6
  13. 22:20:03 : onConnect A : /9.8.7.6
  14. 22:20:03 : onConnect B : /9.8.7.6
  15. 22:20:03 : onConnect C : /9.8.7.6
  16. 22:20:03 : Incoming data A : /9.8.7.6
  17. 22:20:03 : Incoming data B: XXX~est connecté(e) : /9.8.7.6
  18. 22:20:03 : Incoming data C: XXX~est connecté(e) : /9.8.7.6
  19. 22:20:03 : Incoming data D: [Ljava.lang.String;@7224ccce : /9.8.7.6
  20. 22:20:03 : Outgoing data : XXX: est connecté(e)
  21. 22:20:03 : Outgoing data A : XXX: est connecté(e)
  22. 22:20:03 : Outgoing data B : XXX: est connecté(e)
  23. 22:20:26 : Incoming data A : /9.8.7.6
  24. 22:20:26 : Incoming data B: XXX~Je te vois YYY! : /9.8.7.6
  25. 22:20:26 : Incoming data C: XXX~Je te vois YYY! : /9.8.7.6
  26. 22:20:26 : Incoming data D: [Ljava.lang.String;@6e431d9d : /9.8.7.6
  27. 22:20:26 : Outgoing data : XXX: Je te vois YYY!
  28. 22:20:26 : Outgoing data A : XXX: Je te vois YYY!
  29. 22:20:26 : Outgoing data B : XXX: Je te vois YYY!
  30. 22:21:04 : Incoming data A : /5.4.3.2
  31. 22:21:04 : Incoming data B: YYY~Moi aussi ! : /5.4.3.2
  32. 22:21:04 : Incoming data C: YYY~Moi aussi ! : /5.4.3.2
  33. 22:21:04 : Incoming data D: [Ljava.lang.String;@6d552524 : /5.4.3.2
  34. 22:21:04 : Outgoing data : YYY: Moi aussi !
  35. 22:21:04 : Outgoing data A : YYY: Moi aussi !
  36. 22:21:04 : Outgoing data B : YYY: Moi aussi !
  37. 22:22:47 : Incoming data A : /5.4.3.2
  38. 22:22:47 : Incoming data B: YYY~je viens de partir !! : /5.4.3.2
  39. 22:22:47 : Incoming data C: YYY~je viens de partir !! : /5.4.3.2
  40. 22:22:47 : Incoming data D: [Ljava.lang.String;@41796abe : /5.4.3.2
  41. 22:22:47 : Outgoing data : YYY: je viens de partir !!
  42. 22:22:47 : Outgoing data A : YYY: je viens de partir !!
  43. 22:24:30 : onConnect : /5.4.3.2
  44. 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.

Reply

Marsh Posté le 23-01-2013 à 09:57:47   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed