J'ai écrit un client de chat qui fonctionnait bien jusqu'à ce que je décide d'ajouter quelque chose d'expéditeur de fichier qui devrait envoyer un fichier du client au serveur. Après avoir ajouté les lignes pour l'expéditeur du fichier, il ne montre plus les messages.Problèmes d'écriture de chat Java
Je pense que le problème est ici, avec deux instructions try dans run().
public void run(){
InputStream input = null;
try{
input = socket.getInputStream();
BufferedReader inReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//Citeste calea fisierului
String filename = inReader.readLine();
if(filename.equals("")){
//Trimit status READY la client
outReader.write("READY\n");
outReader.flush();
}
FileOutputStream wr = new FileOutputStream(new File("C://tmp/"+filename));
byte[] buffer = new byte[socket.getReceiveBufferSize()];
int bytesReceived = 0;
while((bytesReceived = input.read(buffer)) > 0){
wr.write(buffer,0,bytesReceived);
}
}
catch(IOException e){
Logger.getLogger(ConectareClient.class.getName()).log(Level.SEVERE,null,e);
}
try{
//Inregistreaza firul curent in listaObiecte
listaObiecte.addElement(this);
System.out.println("\n Fir de executie nou");
System.out.println(this.toString());
System.out.println(listaObiecte.toString());
//Bucla
while(true){
//Se citeste mesajul din fluxul de intrare trimis de client
String mesaj = fluxIntrare.readUTF();
//Se transmite mesajul catre toti clientii conectati
transmite(mesaj);
}
}
//Tratare exceptie conexiune
catch (IOException e){
e.printStackTrace();
}
finally{
//Stergere fir curent din listaObiecte
listaObiecte.removeElement(this);
System.out.println("\n Fir de executie inchis");
System.out.println(this.toString());
System.out.println(listaObiecte.toString());
try{
//Inchidere socket
socket.close();
input.close();
}
//Tratare exceptie conexiune
catch (IOException e){
e.printStackTrace();
}
}
}
private static void transmite(String mesaj){
//Enumerare generata de lista firelor de executie
Enumeration enm = listaObiecte.elements();
//Cat timp mai sunt elemente in enumerare
while(enm.hasMoreElements()){
//Se initializeaza cu null referinta firului curent
ConectareClient firDestinatie = null;
//Se protejeaza vectorul firelor de acces simultan
synchronized(listaObiecte){
//Se memoreaza referinta catre firul curent
firDestinatie = (ConectareClient) enm.nextElement();
}
//Referinta valida
if(firDestinatie != null){
try{
//Se protejeaza fluxul de iesire de acces simultan
synchronized(firDestinatie.fluxIesire){
//Scriere mesaj in flux de iesire
firDestinatie.fluxIesire.writeUTF(mesaj);
}
//Mesajul este transmis
firDestinatie.fluxIesire.flush();
}
catch(IOException e){
firDestinatie.stop();
}
}
}
}
Ici vous pouvez télécharger tous les fichiers source. http://www.megaupload.com/?d=ULFDBP6M
Merci.
Le client peut-il envoyer un fichier appelé «.. \ windows \ system32 \ user32.dll»? –
bien, la partie d'envoi de fichier a été prise à partir d'une autre application que j'ai écrite et il fonctionnait très bien, envoyant tous les types de fichiers. –
Oui, c'est exactement le problème que j'ai essayé de vous dire. Lorsque le client envoie un nom de fichier contenant '..', le serveur écrase complètement les fichiers non liés, ce qui ne devrait pas être le cas. Vous devez vérifier les * mauvais noms de fichiers * avant de créer le fichier. –