Coucou,

je réalise en ce moment un chat en java utilisant l'UDP (ça m'est imposé car je dois utiliser le multicast).

Pour l'instant l'application se limite à un client qui envoie un paquet de connexion au serveur. Le serveur lui répond en lui envoyant la liste des gens connectés.

Seulement aléatoirement, la liste n'atteint jamais le client... Et curieusement quand le transfert échoue, si je lance un deuxième client, le premier reçois la liste à sa place, et ainsi de suite... Si quelqu'un a une idée, ou peut me dire si il y a des erreurs fondamentales dans mon code, ça m'aiderait beaucoup ^^

voila le code, je préviens tout de suite, je ne vise pas l'optimisation ultime j'ai commencé Java il y a 1 semaine comme un grand et pour l'instant je lis la doc toute la journée...

MERCI !

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
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
 
 
 
package server;
 
import java.net.*;
import java.io.*;
 
public class UDPServer {
 
    public static void main(String[] args) {
 
        byte  [ ] buf = new byte [65535];
        int port = 8000;
        try {
            //Open socket on port 8000
            DatagramSocket socket = new DatagramSocket(port);
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            System.out.println("Server is running and listenning to port 8000");
 
            Thread t1 = new Thread(new Connection(socket, packet, buf));
            t1.start();
 
        } catch (SocketException ex) {
            ex.printStackTrace();
        }   
    }
 
}
 
class Connection implements Runnable{
 
    private DatagramSocket socket = null;
    private DatagramPacket packet = null;
    private byte[] buf = null;
 
    public Connection(DatagramSocket socket, DatagramPacket packet, byte[] buf){
        this.socket = socket;
        this.packet = packet;
        this.buf = buf;        
    }
 
    public void run(){
        while(true){
            try {
                System.out.println("Waiting for peers...");
 
                socket.receive(packet);
                String login = new String (buf,0,packet.getLength());
                System.out.println(login+" has requested a connection...");
 
                //Add new peer to list
                PrintWriter fout;
                File file = new File("c:\\Documents and Settings\\Moi\\Bureau\\peerList.txt");
 
                    fout = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
                    fout.println(login);
                    fout.close();
 
                    //Broadcast list
 
                    FileInputStream is = new FileInputStream(file);
                    double length = file.length();
 
                    ByteArrayOutputStream output = new ByteArrayOutputStream((int)length);
                    byte[] listBuffer = new byte[1024];
                    int count = 0;
                    while ((count = is.read(listBuffer)) != -1) {
                    	output.write(listBuffer, 0, count);                        
                    }
                    output.close();
                    is.close();
 
                    byte[] buffer = new byte[(int)length];
                    buffer = output.toByteArray();
 
                    InetAddress group = Inet4Address.getByName("224.0.0.1");
                    DatagramPacket packet2 = new DatagramPacket(buffer, buffer.length, group, 7000);
                    socket.send(packet2);               
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
CLIENT ( il y a une interface utilisateur donc je copie juste la fonction principale)
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
 
private void connectButtonMouseClicked(java.awt.event.MouseEvent evt) {
try {
 
     //bind with server socket
     String id = name.getText();
     String ip = serverIp.getText();
     int portNb = Integer.parseInt(port.getText());
 
     byte  [ ] data = id.getBytes();
     InetSocketAddress serverSocket = new InetSocketAddress(ip, portNb);
     DatagramPacket packet = new DatagramPacket(data, data.length,serverSocket);
 
     //Register to server
     DatagramSocket socket = new DatagramSocket();
     socket.send(packet);
 
     //Open multicast socket
     MulticastSocket udpsocket = new MulticastSocket(7000);
     InetAddress group = InetAddress.getByName("224.0.0.1");
     udpsocket.joinGroup(group);
 
     //prepare packets for recieving
     byte[] buffer = new byte[65535];
     DatagramPacket packetRecu = new DatagramPacket(buffer, buffer.length);
 
     //Receive message from server
     //@param peerList le nom de la zone de texte qui contient
     // la liste dans l interface utilisateur                    
     Thread t3 = new Thread(new RecieveList(udpsocket, packetRecu, peerList));
      t3.start();
} catch (SocketException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();	
}
}
 
class RecieveList implements Runnable{
 
    private DatagramSocket socket = null;
    private DatagramPacket packet = null;
    private javax.swing.JTextArea list = null;
 
    public RecieveList(DatagramSocket socket, DatagramPacket packet, javax.swing.JTextArea list){
        this.socket = socket;
        this.packet = packet;
        this.list = list;
    }
 
    public void run(){
            //Ici je boucle car une fois connecté le client peut recevoir a tout moment une update de la liste des connectés si un nouveau arrive, donc il doit ecouter en boucle
            while(true){
            try {
                socket.receive(packet);
                String received = new String(packet.getData(), 0, packet.getLength());
                list.setText(received);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}