Bonjour, je post car j'ai un probleme avec une appli Client Serveur que je developpe actuellement. Pour vous expliquer le fonctionnement jai un serveur qui attend des connexions, s'il y en a une il lance un thread client qui boucle tant quil n'a pas d'instruction, s'il en a il lance un thread. De l'autre coté j'ai un Client qui se connecte au serveur et lance une instruction au serveur via un boutton swing. Mon test ici est de lancé un thread par le serveur pour envoyé un fichier et de l'autre coté mon client lance un thread pour la réception. Mon probleme : le fichier est reçu mais pas entier. Je sollicite donc votre attention pour essayer de résoudre mon probleme le code :
Serveur :
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class Serveur {
private ServerSocket serverSocket;
public ArrayList<PrintStream> liste;
public Serveur(int port){
try {
serverSocket = new ServerSocket(port);
while(true){
System.out.println("Attente Connexion ...");
System.out.println("----------------");
Socket socket = serverSocket.accept();
System.out.println("Client connecté");
//pour les transferts de fichier
OutputStream fluxsortie = socket.getOutputStream();
InputStream fluxentrant = socket.getInputStream();
//pour les commandes
PrintStream commandeOut= new PrintStream(socket.getOutputStream());
BufferedReader commandeIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Client client = new Client(commandeIn,commandeOut,fluxentrant,fluxsortie);
client.start();
}
}
catch (IOException e) {e.printStackTrace();}
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Send extends Thread{
OutputStream fluxsortie;
String fichier="";
public Send(OutputStream fluxsortie, String fichier){
this.fluxsortie=fluxsortie;
this.fichier=fichier;
}
public synchronized void run(){
File f = new File(this.fichier);
if(f.exists())
{
try{
System.out.println("Envoi du fichier "+f.toURI().toURL());
long taillefichier =f.length();
System.out.println("Taille : "+ taillefichier);
long nbpassagesuposé=taillefichier / 4096;
System.out.println("Passages supposés : "+nbpassagesuposé);
InputStream in = new BufferedInputStream(new FileInputStream(f));
ByteArrayOutputStream tableaubytes = new ByteArrayOutputStream();
BufferedOutputStream tampon = new BufferedOutputStream(tableaubytes);
int lu = in.read();
int[] aecrire = new int[4096];
int compteur = 0;
long ouonestrendu=0;
//Tant qu'on est pas à la fin fu chier
while(lu > -1)
{
//On lit les données du fichier
aecrire[compteur] = lu;
lu = in.read();
compteur++;
//Quand on a rempli le tableau, on envoie un paquet de 4096 octets
if(compteur == 4096)
{
compteur=0;
ouonestrendu++;
//On remplit le tampon
for(int x=0;x<4096;x++)
tampon.write(aecrire[x]);
//Et on l'envoie
fluxsortie.write(tableaubytes.toByteArray());
tableaubytes.reset();
System.out.println("Avancement : "+(float) ouonestrendu/nbpassagesuposé * 100+"%");
}
}
//On envoie le dernier paquet, qui ne fait pas forcément 4096 octets
//On remplit le tampon
for(int x=0;x<4096;x++)
tampon.write(aecrire[x]);
//Et on l'envoie
tampon.flush();
fluxsortie.write(tableaubytes.toByteArray());
fluxsortie.flush();
System.out.println("Avancement: "+(float) ouonestrendu/nbpassagesuposé * 100+"%");
System.out.println("Youpi finished");
in.close();
tampon.close();
System.out.println("Passages effectués : "+ouonestrendu);
}
catch(IOException e){e.printStackTrace();}
}
else
{
System.out.println("Le fichier "+f+" est introuvable");
}
}
}
Mon client :
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.*;
public class Client {
PrintStream outServeur;
BufferedReader inServeur;
//Création de l'entrée pour reception fichier
InputStream inpute;
public Client() throws UnknownHostException{
Fenetre frame = new Fenetre(this);
frame.ecrire("Salut");
//adresse serveur
InetAddress adresse =InetAddress.getByName("localhost");
//requete
String mess ="WANT /Users/zimon/Desktop/fondGui.jpg";
String mess2="LIST";
String messServeur="";
try {
Socket serviceSocket = new Socket(adresse, 4501);
outServeur = new PrintStream(serviceSocket.getOutputStream(),true);
inServeur = new BufferedReader(new InputStreamReader(serviceSocket.getInputStream()));
inpute = serviceSocket.getInputStream();
while(true){
String ligne = inServeur.readLine();
if (ligne!=null){
frame.ecrire(ligne);
}
}
}
catch (IOException e) {e.printStackTrace();}
}
public static void main(String[] args) throws UnknownHostException{
Client cli = new Client();
}
GUI Client :
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Fenetre extends JFrame implements ActionListener {
JLabel label;
JPanel pan;
JButton bouton;
Client cli;
public Fenetre(Client cli){
this.cli=cli;
Toolkit t = this.getToolkit();
Dimension d = t.getScreenSize();
pan = new JPanel();
label = new JLabel();
bouton= new JButton("WANT");
bouton.addActionListener(this);
pan.setSize(100,70);
//pan.add(label);
pan.add(bouton);
this.setTitle("Client");
this.setSize(500, 300);
this.setLocationRelativeTo(null);
this.setUndecorated(false);
this.setContentPane(pan);
this.setVisible(true);
}
public void ecrire(String message){
this.pan.add(new JLabel(message));
}
public void actionPerformed(ActionEvent ev) {
Object action = ev.getSource();
if(action==bouton){
Receiver receiver = new Receiver(this.cli.inpute);
receiver.start();
this.cli.outServeur.println("WANT /Users/zimon/Desktop/fondGui.jpg");
}
}
}
Le thread Receiver pour la reception fichier :
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Receiver extends Thread {
InputStream inpute;
public Receiver(InputStream inpute){
this.inpute=inpute;
}
public synchronized void run(){
while(true)
{
try{
//On attend la connexion
Byte[] taillefichier;
int lu;
long taille = 0;
OutputStream out = new FileOutputStream("/Users/zimon/Desktop/test.jpg");
//Reçoit du client
BufferedInputStream inBuffer = new BufferedInputStream(inpute);
//Envoi vers le fichier
BufferedOutputStream outBuffer = new BufferedOutputStream(out);
lu = inBuffer.read();
int compteur = 0;
while(lu > -1)
{
outBuffer.write(lu);
lu = inBuffer.read();
compteur++;
}
outBuffer.write(lu);
outBuffer.flush();
outBuffer.close();
inBuffer.close();
out.flush();
out.close();
//inpute.close();
}
catch (IOException e){e.printStackTrace();}
}
}
}
Lanceur Serveur :
import java.io.IOException;
import java.net.Socket;
public class Lanceur {
public static void main(String[] args){
int port = 4501;
Serveur serveur = new Serveur(port);
}
}
[Reseau] Porbleme transfert de fichier appli Client Serveur
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.