Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 02:30   #1
Strangers
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 64
По умолчанию Клиент-сервер

Доброй ночи ув. программисты. Возникла следующая проблема: есть клиент-серверное приложение для закачки файла от клиента серверу. Логика работы следующая: вначале клиент передает имя файла-сервер принял, далее клиент передает размер файла- сервер принял, и наконец клиент передает сам файл.
Если запускать и клиент, и сервер на одной машине, то все работает нормально. А если на разных, то имя файла передается нормально, а вот размер файла нет. В результате поиска ошибок выявил что при передаче размера файла туда же лезет и кусок файла. В чем может быть проблема подскажите пожалуйста. Заранее благодарен.
Strangers вне форума Ответить с цитированием
Старый 06.02.2013, 06:15   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Это связано с предыдущей Вашей темой ? http://programmersforum.ru/showthread.php?p=1173343

Если так, то приведите полные проекты для тестов, без кода сложновато что-то сказать, тем более , что код , я так понимаю, Вы собирали с разных мест.
phomm вне форума Ответить с цитированием
Старый 06.02.2013, 10:40   #3
Strangers
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 64
По умолчанию

Да, это связано с этим проектом, но код уже почти полностью переписал. Вечером выложу методы передачи и приема файла. Спасибо за помощь.
Strangers вне форума Ответить с цитированием
Старый 07.02.2013, 02:43   #4
Strangers
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 64
По умолчанию

Метод получения файла.
Код:
public void ReceiveFile()
        {
            FileStream stream = null;
            BinaryWriter fileBinWriter = null;
            byte[] buffer = new byte[1024]; 
            string fileName = string.Empty;
            UInt64 fileSize = 0; 
            byte[] bFileName = new byte[512];
            byte[] bFileSize = new byte[512];

            try
            {
                _ReceiveDone.Reset();
                _sClient.BeginReceive(bFileName, 0, bFileName.Length, 0, new AsyncCallback(ReceiveCallback), _sClient); 
                _ReceiveDone.WaitOne(); 
                fileName = Encoding.UTF8.GetString(bFileName);
                fileName = fileName.TrimEnd('\0');
                Console.WriteLine(fileName);
                
                _ReceiveDone.Reset();
                _sClient.BeginReceive(bFileSize, 0, bFileSize.Length, 0, new AsyncCallback(ReceiveCallback), _sClient); 
                _ReceiveDone.WaitOne(); 
                Console.WriteLine(Encoding.UTF8.GetString(bFileSize));
                fileSize = Convert.ToUInt64(Encoding.UTF8.GetString(bFileSize));
                Console.WriteLine(fileSize);
                
                
                string path= "D:\\\\ServerDirectory\\"+fileName ;
                stream = new FileStream(path, FileMode.CreateNew, FileAccess.Write);
                fileBinWriter = new BinaryWriter(stream);
                UInt64 processed = 0;
                while (processed < fileSize)
                {
                    _ReceiveDone.Reset();
                    _sClient.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallback), _sClient);
                    _ReceiveDone.WaitOne(); 
                    fileBinWriter.Write(buffer, 0, buffer.Length);
                    processed += 1024;
                }
                fileBinWriter.Close();
            }

            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }

        private void ReceiveCallback(IAsyncResult _asyncResult)
        {
            Socket sClient = (Socket)_asyncResult.AsyncState;
            int bytesReceived = sClient.EndReceive(_asyncResult);
            _ReceiveDone.Set();
        }
Метод отправки файла
Код:
public void SendFile(string _path)
        {
            FileStream stream = null;  
            BinaryReader fileBinReader = null; 
            byte[] buffer = new byte[1024];    
            string fileName = string.Empty;    
            UInt64 fileSize;                  

            try
            {
                fileName = Path.GetFileName(_path);
                _SendDone.Reset();
                SendAsync(Encoding.UTF8.GetBytes(fileName)); 
                _SendDone.WaitOne();

                stream = new FileStream(_path, FileMode.Open, FileAccess.Read);
                fileBinReader = new BinaryReader(stream);
                fileSize = (UInt64) stream.Length;
                _SendDone.Reset();
                SendAsync(Encoding.UTF8.GetBytes(Convert.ToString(fileSize))); 
                _SendDone.WaitOne(); 

                
                int bytes = 1024;
                UInt64 processed = 0;
                while (processed < fileSize)
                {
                    if ((fileSize - processed) < 1024)
                    {
                        bytes = (int)(fileSize - processed);
                        byte[] buf = new byte[bytes];
                        fileBinReader.Read(buf, 0, bytes);
                        _SendDone.Reset();
                        SendAsync(buf);
                        _SendDone.WaitOne();
                    }
                    else
                    {
                        fileBinReader.Read(buffer, 0, bytes);
                        _SendDone.Reset();
                        SendAsync(buffer);
                        _SendDone.WaitOne();
                    }
                    processed += 1024;
                }
                _SendDone.WaitOne(); 
                fileBinReader.Close();
                _SendFile.Set();
            }

            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
Strangers вне форума Ответить с цитированием
Старый 07.02.2013, 07:30   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

А можно проектом ? собирать энто дело - никакого желания времени тратить, желательно сразу посчупать проблему, плюс данные на которых тестить - явки там, пароли ) шучу, ну просто там если сервер поднимать чего надо - локальную сетку Вам или же прямо инет, чтобы я пробовал в условиях приближенных к Вашим, соответственно и опишите как Вы делаете.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57