2010-12-14 75 views
1

Actuellement, j'ai ce problème. Les téléchargements du client à partir du serveur réussissent seulement la première fois. La 2ème fois ça ne marche pas (rien ne se passe, pas de crash). Ici le code des deux côtés:Client socket C# tcp télécharge les fichiers du serveur

Au client, dans mainForm, Si je clique sur le bouton de téléchargement, j'appellerai une méthode sendComment (demande de chaîne) d'une autre classe, loginForm.

Au serveur, après avoir reçu la requête de chaîne du client, le serveur appellera sendComment (string listFiles). listFiles est constitué de tous les noms et tailles de fichiers que le client doit télécharger. Le format string listFiles: "commitRequest mName usID fiName1 fiSize1 fiName2 fiSize2 ..." Après avoir reçu cette chaîne, le client demandera chaque fichier dans la chaîne.

côté client:

loginForm:

private void Connect() 
    { 
     try 
     { 
      serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      serversocket.Blocking = true; 

      IPHostEntry IPHost = Dns.Resolve(textBox1.Text); 
      string[] aliases = IPHost.Aliases; 
      IPAddress[] addr = IPHost.AddressList; 

      IPEndPoint ipepServer = new IPEndPoint(addr[0], 8090); 
      serversocket.Connect(ipepServer); 
      clientsock = serversocket; 

      Thread MainThread = new Thread(new ThreadStart(listenclient)); 
      MainThread.Start(); 
      MessageBox.Show("Connected successfully", "Infomation", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
     catch (SocketException se) 
     { 
      Console.WriteLine(se.Message); 
     } 
     catch (Exception eee) 
     { 
      MessageBox.Show("Socket Connect Error.\n\n" + eee.Message + "\nPossible Cause: Server Already running. Check the tasklist for running processes", "Startup Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Application.Exit(); 
     } 
    } 
    void listenclient() 
    { 
     Socket sock = clientsock; 
     string cmd = server; 
     byte[] sender = System.Text.Encoding.ASCII.GetBytes("CLIENT " + cmd); 
     sock.Send(sender, sender.Length, 0); 

      while (sock != null) 
      { 
       cmd = ""; 
       byte[] recs = new byte[32767]; 
       int rcount = sock.Receive(recs, recs.Length, 0); 
       string clientmessage = System.Text.Encoding.ASCII.GetString(recs); 
       clientmessage = clientmessage.Substring(0, rcount); 

       string smk = clientmessage; 

       cmdList = null; 
       cmdList = clientmessage.Split(' '); 
       string execmd = cmdList[0]; 

       sender = null; 
       sender = new Byte[32767]; 

       string parm1 = ""; 


       if (execmd == "CommitRequest") 
       { 
        for (int i = 3; i < cmdList.Length - 1; i++) 
        { 
         if (i % 2 == 1) 
         { 
          sendComment("downloadFile " + cmdList[i]); // after receiving this, server will upload the file requested 
          downloadMFromServer(sock, cmdList[2], cmdList[1], cmdList[i], cmdList[i + 1]);         
         } 

        } 
        continue; 
       } 
      } 


private void downloadMFromServer(Socket s, string userID, string mName, string fileN, string fileS) 
    {     
        Socket sock = s; 
        string rootDir; 
        rootDir = @"C:\Client Data" + "\\" + userID + "\\" + mName; 
        Directory.CreateDirectory(rootDir); 
        System.IO.FileStream fout = new System.IO.FileStream(rootDir + "\\" + fileN, FileMode.Create, FileAccess.Write); 
        NetworkStream nfs = new NetworkStream(sock); 
        long size = int.Parse(fileS); 
        long rby = 0; 
        try 
        { 
         while (rby < size) 
         { 
          byte[] buffer = new byte[1024]; 
          int i = nfs.Read(buffer, 0, buffer.Length); 
          fout.Write(buffer, 0, (int)i); 
          rby = rby + i; 
         } 
         fout.Close(); 
        } 
        catch (Exception ed) 
        { 
         Console.WriteLine("A Exception occured in file transfer" + ed.ToString()); 
         MessageBox.Show(ed.Message); 
        } 
       } 

Après le bouton 1er téléchargement clic, les fichiers téléchargés au client avec succès, alors j'ai supprimé tous les fichiers téléchargés, puis j'ai cliqué sur le bouton de téléchargement 2ème fois, mais cette fois ça n'a pas marché.

Les fichiers n'ont pas été téléchargés. J'ai essayé le débogage, il n'a montré aucune erreur, mais l'application cliente s'est arrêtée à l'étape de réception de la chaîne listFiles du serveur. Je veux dire chaîne sended client re ok. le serveur a reçu la chaîne re ok. serveur sended string listFiles ok. mais le client n'a pas eu listFiles. Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas? Merci d'avance pour votre aide.

Voici le code de la méthode sendComment, il en est de même pour les applications client et serveur.

public void sendComment(string comment) 
{ 
    Socket serversock = serversocket; 
    if (serversock == null) 
    { 
     MessageBox.Show("Client not connected", "Connect Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 
    byte[] b = System.Text.Encoding.ASCII.GetBytes(comment + " "); 
    serversock.Send(b, b.Length, 0); 
} 

Je ne télécharge pas le code côté serveur parce que je ne pense pas qu'il y ait un problème avec elle et ce poste serait un peu long, mais si vous avez besoin juste dire et je vais poster.

+0

fermer la prise? – Euclid

+0

que voulez-vous dire? Je ne l'ai pas fermé du côté client. Et si je clique sur le bouton de téléchargement la 2ème, ou la 3ème fois ce serait toujours pareil. Le serveur a envoyé la chaîne de fichiers fileList mais le client ne l'a pas obtenue. – PeteMerry

+0

Le code est juste douloureux à lire. Essayez de le réduire à un exemple minimal qui a toujours le problème. Vous pourriez juste résoudre votre problème le long du chemin :) –

Répondre

1

Je viens de résoudre ce problème par moi-même. En fait, je construis simplement la solution au lieu d'exécuter le débogage et les applications serveur et client fonctionnent correctement. Le problème semble augmenter seulement quand j'essaye de déboguer. Peut-être que c'est un bogue Visual Studio ou qu'il y a quelque chose dans mon code qui empêche le débogage.