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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2021, 18:27   #1
Menmo
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 40
По умолчанию Обмен файлами и информацией ClientSocket and ServerSocket

Дорогие программисты, не бейте тапками, начинаю только программировать...
В общем, такой вопрос, я разобрался, как от Сервера к Клиенту передать файл, всё работает отлично, даже все пакеты соединяются правильно.
Но у меня очень большой вопрос, как сделать обратный процесс? С Клиента выслать файл серверу? И возможно ли это?
Может быть вопрос очень тупой, но обыскал все темы и весь гугл - решения не нашёл (мб просто тупенький и не увидел его)
Menmo вне форума Ответить с цитированием
Старый 10.02.2021, 19:00   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Menmo Посмотреть сообщение
ак от Сервера к Клиенту передать файл, всё работает отлично, даже все пакеты соединяются правильно.
Но у меня очень большой вопрос, как сделать обратный процесс? С Клиента выслать файл серверу? И возможно ли это?
Точно так же просто меняешь клиент на сервер.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 10.02.2021, 19:12   #3
Menmo
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 40
По умолчанию

Pavia, пробовал, сокет отправляется, а вот сервер его не принимает... Не сохраняет файл..
Menmo вне форума Ответить с цитированием
Старый 10.02.2021, 19:26   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Menmo Посмотреть сообщение
а вот сервер его не принимает... Не сохраняет файл..
А как сохраняете? Как вычитываете?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 10.02.2021, 20:12   #5
Menmo
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 40
По умолчанию

Pavia, отправляю (сервер)
Код:
begin
  MS := TMemoryStream.Create; // Создаём буфер для файла
  MS.LoadFromFile('.\Config\'+Datetostr(Date)+'\zav.txt'); // Загружаем файл в буфер
  // Посылаем информацию о файл (команда # название # размер)
  ServerSocket1.Socket.Connections[0].SendText('file#'+'.\Config\'+Datetostr(Date)+'\zav.txt'+'#'+IntToStr(MS.Size)+'#');
  MS.Position := 0; // Переводим каретку в начало файла
  P := MS.Memory; // Загружаем в переменную "P" файл
  Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл
  // Выводим прогресс
  ProgressBar1.Position := Size*100 div MS.Size;
  StatusBar1.SimpleText := 'Отправлено '+IntToStr(Size)+' из '+IntToStr(MS.Size)+' байт';
   end;
Получаю (клиент)
Код:
var
  Rtext: string; // Принятый текст
begin
  Rtext := Socket.ReceiveText;
  if Receive then // Если клиент в режиме приёма файла, то...
    Writing(RText) // Записываем данные в буфер
  else // Если клиент не в режиме приёма файла, то...
  begin
    if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
    begin
      MS := TMemoryStream.Create; // Создаём буфер для файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
      Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
      Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
      Label56.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
      Label57.Caption := 'Имя файла: '+Name; // Выводим имя файла
      Receive := true; // Переводим сервер в режим приёма файла
      Writing(RText); // Записываем данные в буфер
    end;
  end;
end;
Код:
procedure TForm1.Writing(Text: AnsiString);
begin
  if MS.Size < Size then // Если принято байт меньше размера файла, то...
    MS.Write(Text[1], Length(Text)); // Записываем в буфер
  // Выводим прогресс закачки файла
  ProgressBar1.Position := MS.Size*100 div Size;
  StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
  if MS.Size = Size then // Если файл принят, то...
  begin
    Receive := false; // Переводим клиента в нормальный режим
    MS.Position := 0; // Переводим каретку в начало буфера
    MS.SaveToFile(Name); // Сохраняем файл
    ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
    MS.Free; // Убиваем буфер
    StatusBar1.SimpleText := 'Файл принят';
  end;
А как обратную связь сделать... Пытался посылать, и вроде как мне статус бар сигнализирует, что файл отправлен, однако он не сохраняется сервером (делал обратный код)
Menmo вне форума Ответить с цитированием
Старый 10.02.2021, 20:19   #6
Menmo
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 40
По умолчанию

Собственно почему не получается:
Если на клиенте есть событие Read, то на Сервере его попросту нет, есть onclienread, пытался туда вставить вот этот код
Код:
var
  Rtext: string; // Принятый текст
begin
  Rtext := Socket.ReceiveText;
  if Receive then // Если клиент в режиме приёма файла, то...
    Writing(RText) // Записываем данные в буфер
  else // Если клиент не в режиме приёма файла, то...
  begin
    if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
    begin
      MS := TMemoryStream.Create; // Создаём буфер для файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
      Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
      Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
      Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
      Label56.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
      Label57.Caption := 'Имя файла: '+Name; // Выводим имя файла
      Receive := true; // Переводим сервер в режим приёма файла
      Writing(RText); // Записываем данные в буфер
    end;
  end;
end;
И соответственно вызвать функцию writing, но сервер никак на это не реагирует..
Я понимаю, что это может быть банально и для многих пустяк, но я голову сломал..
Menmo вне форума Ответить с цитированием
Старый 18.02.2021, 13:16   #7
Menmo
Пользователь
 
Регистрация: 17.10.2012
Сообщений: 40
По умолчанию

Разобрался в чём была проблема, оказалось, что я немного туповат (или много).
Код:
 if socket.ReceiveText = 'end' then // Если клиент принял файл, то...
  begin
    logmemo.Lines.Add ('['+ TimetoSTR(Time)+ '] '+'Передача файла прошла успешно');
    MS.Free; // Убиваем буфер
  end;
После этой строчки сокет "исчезал" из программы, становился пустым.
Немного исправил:
Код:
Rtext := Socket.ReceiveText;
   if Rtext = 'end' then // Если клиент принял файл, то...
И уже после этого писал остальной код и обрабатывал сокет. "Спасибо всем за ответы!"
Menmo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Serversocket и ClientSocket myxosran Работа с сетью в Delphi 3 12.09.2011 20:30
ServerSocket/ClientSocket OffRoad Работа с сетью в Delphi 1 15.05.2011 17:15
Обмен информацией W0LF Общие вопросы Delphi 2 01.01.2010 22:57
ServerSocket и ClientSocket Sensizu Работа с сетью в Delphi 5 30.12.2009 00:09
обмен сообщениями между клиентом и сервером используя ClientSocket и ServerSocket xTANATOSx Работа с сетью в Delphi 3 04.10.2007 15:17