Клиент сокета tcp C # загружает файлы с сервера - PullRequest
1 голос
/ 14 декабря 2010

В настоящее время у меня есть эта проблема.Клиент успешно скачивает с сервера только 1 раз.Во второй раз это не работает (ничего не происходит, без сбоев).Вот код с обеих сторон:

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

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

Формат строки listFiles: "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 от сервера.Я имею в виду, что клиент отправил строку в порядке.сервер получил строку в порядке.сервер отправил строку listFiles в порядке.но клиент не получил 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);
}

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

1 Ответ

1 голос
/ 16 декабря 2010

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

...