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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2012, 22:07   #1
echelone
Пользователь
 
Регистрация: 20.03.2011
Сообщений: 22
Восклицание Проблема с сокетами

Всем доброго, нужно разработать 2 приложения с сокетами:
1)Передача сообщений(сделал)
2)Передача файлов(ошибка) - прошу помочь.(кому нужно могу отправить исходник)
Вылетает окно с ошибкой:
"List Index out of bounds"
Программынй код:
Серверная часть
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Size: integer;
P: ^Byte;
na : String;

begin
MS := TMemoryStream.Create;// Создаём буфер для файла
MS.LoadFromFile(Edit1.Text); // Загружаем файл в буфер
na := ExtractFileName(Edit1.Text);
ServerSocket1.Socket.Connections[0].SendText('file#'+na+'#'+IntToStr(MS.Size)+'#');
MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл
ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Active := false;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
if Socket.ReceiveText = 'end' then // Если клиент принял файл, то...
begin
StatusBar1.SimpleText := 'Клиент принял файл';
MS.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Size: integer;
P: ^Byte;
na : String;
begin

if OpenDialog1.Execute then begin
MS := TMemoryStream.Create;// Создаём буфер для файла
MS.LoadFromFile(OpenDialog1.FileName); // Загружаем файл в буфер
na := ExtractFileName(OpenDialog1.FileName);
ServerSocket1.Socket.Connections[0].SendText('file#'+na+'#'+IntToStr(MS.Size)+'#');
ProgressBar1.Position := MS.Size*100 div Size;
MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл
ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл

end;  end;

end.
Клиентская часть:
Код:
procedure TForm1.Writing(Text: string);
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('Dowloads\'+Name); // Сохраняем файл
ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер
StatusBar1.SimpleText := 'Файл принят';
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active := true;

end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
Rtext: string; // Принятый текст
begin
Rtext := Socket.ReceiveText;
if Receive then // Если клиент в режиме приёма файла, то...
Writing(RText) // Записываем данные в буфер
else // Если клиент не в режиме приёма файла, то...
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)); // Удаляем последний разделитель
Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
Label2.Caption := 'Имя файла: '+Name; // Выводим имя файла
Receive := true; // Переводим сервер в режим приёма файла
Writing(RText); // Записываем данные в буфер
end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение установлено';
end;

end.
echelone вне форума Ответить с цитированием
Старый 13.12.2012, 14:29   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

сюда можно прикладывать файлы. прикладывай.
и задача не понятна
1. посылка от сервера клиенту
2. посылка от клиента серверу
3. посылка файла между клиентами через сервер
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 13.12.2012, 20:28   #3
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Работать это в условиях интерсети никогда не будет.
По вопросу почему обратись к Саша40 - он здесь круче всех по этой теме.
xoodoo вне форума Ответить с цитированием
Старый 13.12.2012, 20:37   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
Работать это в условиях интерсети никогда не будет.
По вопросу почему обратись к Саша40 - он здесь круче всех по этой теме.
ой та ладно, все отлично будет работать если сервер доступен, там нет разницы локалка или интернет.
главное чтоб оно в принципе работало, и доступ был к серверу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2012, 20:59   #5
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Код:
ой та ладно, все отлично будет работать
Прошу любить и жаловать - еще один саша40
xoodoo вне форума Ответить с цитированием
Старый 13.12.2012, 21:44   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
Код:
ой та ладно, все отлично будет работать
Прошу любить и жаловать - еще один саша40
хоть один аргумент что я не прав есть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2012, 22:29   #7
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
хоть один аргумент что я не прав есть?
Конечно.
TCustomWinSocket.SentText/SendBuf - функциональные методы, со всеми вытекающими из этого факта последствиями.
xoodoo вне форума Ответить с цитированием
Старый 13.12.2012, 23:06   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну поподробнее же, ну?

код то работать будет, я не говорил что он будет работать так как этого ждет ТС.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.12.2012, 23:12   #9
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
ну?
Не нукай - не запрягал.

Цитата:
код то работать будет
Не будет.
Достаточно разнести клиент и сервер достаточно "далеко" и попытаться передать одним send-вызовом нечто размером более 8К.
xoodoo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разобраться с сокетами ak-o PHP 2 24.06.2012 18:32
проблема с сокетами Boris-Britva Работа с сетью в Delphi 3 29.12.2010 15:55
Проблема с сокетами в Дельфи Htenez Помощь студентам 3 17.12.2010 12:48
Проблема с сокетами BurningMan Общие вопросы C/C++ 1 06.06.2009 16:10
Небольшая проблема с сокетами RoamingFire Работа с сетью в Delphi 3 27.02.2008 22:58