tags:

views:

201

answers:

1

hello,

im trying to send multiple file over TCP using C# TcpClient, for a single file it works great, but when i have n files, it sends only the first one,

here is my code

SENDING FILES

try
            {
                TcpClient tcpClient = new TcpClient();
                NetworkStream networkStream;
                FileStream fileStream = null;

                tcpClient.Connect(appUpdateMessage.receiverIpAddress, 12000);
                networkStream = tcpClient.GetStream();

                byte[] byteSend = new byte[tcpClient.ReceiveBufferSize];
                string startupPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6);

                DirectoryInfo directoriesInfo = new DirectoryInfo(startupPath);
                DirectoryInfo[] directories = directoriesInfo.GetDirectories();
                FileInfo[] files = directoriesInfo.GetFiles();


                for (int iLoop = 0; iLoop < directories.Length; iLoop++)
                {
                    FileInfo[] subdirectoryFiles = directories[iLoop].GetFiles();

                    foreach (FileInfo fi in subdirectoryFiles)
                    {
                        fileStream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);

                        BinaryReader binFile = new BinaryReader(fileStream);

                        FileUpdateMessage fileUpdateMessage = new FileUpdateMessage();
                        fileUpdateMessage.fileName = fi.Name;
                        fileUpdateMessage.fileSize = fi.Length;
                        fileUpdateMessage.targetDirectory = fi.Directory.Name;

                        MessageContainer messageContainer = new MessageContainer();
                        messageContainer.messageType = MessageType.FileProperties;
                        messageContainer.messageContnet = SerializationManager.XmlFormatterObjectToByteArray(fileUpdateMessage);

                        byte[] messageByte = SerializationManager.XmlFormatterObjectToByteArray(messageContainer);

                        networkStream.Write(messageByte, 0, messageByte.Length);

                        int bytesSize = 0;
                        byte[] downBuffer = new byte[2048];
                        while ((bytesSize = fileStream.Read(downBuffer, 0, downBuffer.Length)) > 0)
                        {
                            networkStream.Write(downBuffer, 0, bytesSize);
                        }
                        fileStream.Close();
                    }
                }
                tcpClient.Close();
                networkStream.Close();

                return true;
            }
            catch (Exception ex)
            {
                //logger.Info(ex.Message);
                return false;
            }
            finally
            {

            }
        }

RECEIVING FILES

try
            {
                TcpClient tcpClient = c as TcpClient;
                NetworkStream networkstream = tcpClient.GetStream();
                FileStream fileStream = null;
                byte[] _data = new byte[1024];
                int _bytesRead = 0;

                _bytesRead = networkstream.Read(_data, 0, _data.Length);

                MessageContainer messageContainer = new MessageContainer();
                messageContainer = SerializationManager.XmlFormatterByteArrayToObject(_data, messageContainer) as MessageContainer;

                switch (messageContainer.messageType)
                {
                    case MessageType.FileProperties:
                        FileUpdateMessage fileUpdateMessage = new FileUpdateMessage();
                        fileUpdateMessage = SerializationManager.XmlFormatterByteArrayToObject(messageContainer.messageContnet, fileUpdateMessage) as FileUpdateMessage;
                        string startupPath = @"d:updatefolder";//System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6);

                        DirectoryInfo mainDirectory = new DirectoryInfo(startupPath);
                        DirectoryInfo targetDirecotry = new DirectoryInfo(startupPath + "\\" + fileUpdateMessage.targetDirectory);

                        if (!targetDirecotry.Exists)
                        {
                            mainDirectory.CreateSubdirectory(fileUpdateMessage.targetDirectory);
                        }

                        fileStream = new FileStream(startupPath + "\\" + fileUpdateMessage.targetDirectory + "\\" + fileUpdateMessage.fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                        long filezie = fileUpdateMessage.fileSize;
                        int byteSize = 0;

                        byte[] downBuffer = new byte[2048];

                        while ((byteSize = networkstream.Read(downBuffer, 0, downBuffer.Length)) > 0)
                        {
                            fileStream.Write(downBuffer, 0, byteSize);
                            if (this.InvokeRequired)
                            {
                                this.Invoke((MethodInvoker)delegate
                                {
                                    //progressBar1.Value = Convert.ToInt32((byteSize * 100) / fileUpdateMessage.fileSize);

                                    progressBar1.Value = Convert.ToInt32((fileStream.Length * 100) / fileUpdateMessage.fileSize);
                                    lblFileName.Text = fileUpdateMessage.fileName;
                                });
                            }
                            else
                            {
                                //progressBar1.Value = Convert.ToInt32((byteSize * 100) / fileUpdateMessage.fileSize);
                                lblFileName.Text = fileUpdateMessage.fileName;
                            }
                        }
                        fileStream.Close();
                        networkstream.Close();
                        break;
                }
            }
            catch (Exception ex)
            {
                //logger.Error(ex.Message);
            }

any idea what am i doing wrong ??

A: 

On Sending Part

your are closing tcpClient.Close(); may be this is the problem

saurabh
hello,this is not the problem, it loops through all the file in the directories and writes them to the network stream, i dunno where is the problem exactely
xnoor
The server loops through all the files, but isn't the client closing the stream after each file? So what's happening is that when it re-initiaties a connection to the server, you will just start with the first file from the server list again.
Jess