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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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.