Socket et lecture du flux
Bonjour,
Je suis actuellement occupé a me créer une classe FTP en Java. Non que les API existantes ne me plaisent pas, mais ca me fait mon petit tutorial perso par la même occasion:).
J'ai 2 soucis sur lesquels j'aimerai avoir l'avis d'expert svp :
1°) Voici la fonction Connect de ma classe :
Code:
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
| public boolean Connect() throws Exception{
m_progress=true;
//...
socket.connect(m_address, 5000);
Thread.sleep(waitTime); //wait for connecting
//Ici je suis obligé de faire un sleep du thread de qq ms et ce à chaque envoi de données également ...
istream = socket.getInputStream();
ostream = socket.getOutputStream();
m_reply=ReadData();
m_progress=false;
if(m_replyVal!=220){
m_connected=false;
CloseSocket();
return false;
}
else{
m_connected=true;
fireFTPSocketStateChanged(SocketState.Connected, SocketType.Normal);
return true;
}
}
private void SendData(String data) throws Exception{
ostream.write((data+"\r\n").getBytes());
ostream.flush();
if(debug) System.out.println("Sent : " + data);
Thread.sleep(waitTime); //Egalement ici je dois faire un sleep pour pouvoir entammer la lecture de la réponse
m_reply = ReadData();
} |
Pouvez-vous me dire pourquoi à chaque envoi de données ou connect je suis obligé de faire un Thread.sleep avant de pouvoir lire la réponse ?
J'aime pas trop faire de sleep dans un Thread ca ralentit quand même l'exécution :(. Est-ce que je fais quelque chose de pas correct ?
2. Dans le cas suivant je recois des données concaténées sur mon flux réseau :
Code:
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
| public String[] GetFilelist(String Mask) throws Exception
{
m_progress = true;
//....
String[] list;
String msg="";
Socket DataSocket = CreateDataSocket();
fireFTPEventMessage("LIST " + Mask,Way.Outgoing,-1);
SendData("LIST " + Mask);
// C'est ici que je recois ma réponse 150, et je recois dans la foulée la 226 que la liste est envoyée ...
if (!(m_replyVal== 150 || m_replyVal== 125))
{
Disconnect();
throw new IOException("Error sending LIST Command - " + m_reply);
}
fireFTPEventMessage("Opening Data Connection ...", Way.System,-1);
OutputStream out = DataSocket.getOutputStream();
out.flush();
InputStream in = DataSocket.getInputStream();
while(in.available()!=0){
int bytes=in.read(m_buffer, 0, m_buffer.length);
msg += new String(m_buffer,0,bytes);
if(debug) System.out.println("Message Received : " + msg);
}
list = msg.split("\r\n");
fireFTPEventMessage("Closing Data Connection",Way.System,-1);
DataSocket.close();
fireFTPSocketStateChanged(SocketState.Closed,SocketType.Normal);
Thread.sleep(waitTime);
//m_reply= ReadData();
if (m_replyVal!= 226)
{
throw new IOException("Problem closing Data Connection : " + m_reply.substring(4));
}
m_progress = false;
return list;
} |
Pourquoi est-ce que les messages reçus après "LIST *" sont concaténés ?
J'exécute ce même code en c# (même exercice que j'avais fait à l'époque en c#) et la ca marche bien ...
Merci de votre aide,
Looney