2010-12-14 1 views
1

В настоящее время у меня есть эта проблема. Клиент загружается с сервера только в первый раз. Второй раз он не работает (ничего не происходит, без сбоев). Здесь код с обеих сторон:C# tcp socket client загружает файлы с сервера

На клиенте в mainForm, если я нажму кнопку загрузки, я вызову метод sendComment (запрос строки) из другого класса, loginForm.

На сервере после получения запроса строки от клиента сервер будет вызывать sendComment (string listFiles). listFiles состоит из всех имен файлов и размеров, которые требуется загрузить клиенту.

Строка listFiles format: "commitRequest mName usID fiName1 fiSize1 fiName2 fiSize2 ...". После получения этой строки клиент будет запрашивать каждый файл в строке.

стороне клиента:

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); 
        } 
       } 

После 1 загрузки кнопки мыши, файлы, загруженные к клиенту успешно, то я удалил все файлы загружены, а затем я нажал на кнопку загрузки 2-й раз, но на этот раз это не сработало.

Файлы не были загружены. Я пробовал отлаживать, он не показывал никаких ошибок, но клиентское приложение остановилось на шаге, получая строку listFiles с сервера. Я имею в виду клиентскую строку с подтверждением. сервер получил строку re ok. server sended string listFiles ok. но клиент не получал listFiles. Кто-нибудь знает, почему это не работает? Заранее благодарны за Вашу помощь.

Вот код метода sendComment, он одинаковый для клиентского и серверного приложений.

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); 
} 

Я не загружать код на стороне сервера, потому что я не думаю, что есть какие-либо проблемы с ним, и этот пост будет немного долго, но если вам нужно просто сказать, и я отправлю его.

+0

закрыть розетку? – Euclid

+0

Что вы имеете в виду? Я не закрыл его на стороне клиента. И если я нажму на кнопку загрузки 2-го или 3-го раза, все равно будет то же самое. Сервер отправил строку fileList, но клиент ее не получил. – PeteMerry

+0

Код просто больно читать. Попробуйте уменьшить его до минимального примера, который все еще имеет проблему. Вы можете просто решить свою проблему по пути :) –

ответ

1

Я просто решил это самостоятельно. На самом деле, я просто создаю решение вместо того, чтобы запускать отладку, и как серверное, так и клиентское приложение работают нормально. Проблема, кажется, растет только тогда, когда я пытаюсь отлаживать. Возможно, это ошибка Visual Studio, или что-то в моем коде предотвращает отладку.