Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посылка сообщения серверу и наооборот 
:(
    Опции темы
AndreyZ53
Дата 10.5.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: 1
Всего: 2



Всем привет, использую компоненты TidTCPClient и TidTCPServer. Так вот клиентом подключаюсь к серверу все нормально, но вот почему-то сообщения никак ни туда ни обратно не получается отослать, я тока начал изучать эту архитектуру и компоненты, чето успел посмотреть и понять, но вот с сообщениями че-то не клиится совсем. Вот как делаю отправку сообщений от клиента к серверу
Клиент:
Код

  type
   TWriteBlock=record
    DNS:string;
    Size:integer;
    MSG:string;
  end;


procedure TForm1.Button1Click(Sender: TObject);
var
WriteBlock:TWriteBlock;
begin
   WriteBlock.DNS:=IdTCPClient1.LocalName;
   WriteBlock.MSG:=Edit1.Text;
   IdTCPClient1.WriteBuffer(WriteBlock,SIZEOf(WriteBlock),true);
end;



Сервер, прием сообщения:
Код

  type
   TReadBlock=record
    DNS:string;
    Size:integer;
    MSG:string;
  end;



procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
ReadBlock:TReadBlock;
begin
   AThread.Connection.ReadBuffer(ReadBlock,sizeof(ReadBlock));
   Memo1.Lines.Add(ReadBlock.DNS+ReadBlock.MSG);
end;


При отправке сообщения сервер виснет полностью, кто сможет чем помочь буду очень благодарен
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Romikgy
Дата 10.5.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



не проще ли
Код

procedure WriteLn(const AOut: string = ''); virtual;
function ReadLn(ATerminator: string = LF;
      const ATimeout: Integer = IdTimeoutDefault; AMaxLineLength: Integer = -1): string; virtual;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Matematik
Дата 10.5.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Код

  type
   TWriteBlock=record
    DNS:string;
    Size:integer;
    MSG:string;
  end;


1) Не record, а packed record
2) string нелья передать так просто, в таком случае на сервер посылается не сама строка, а указатель на строку в памяти. 
Тут надо делать строку фиксированной длинны string[10], но тогда две проблемы: нельзя передать строку больше чем заявлено и если строка меньше - будут передаваться лишние данные. Чтобы передавать строки любого размера и без лишнего мусора, надо делать другой механизм передачи, WriteLn/Readln например
3) IdTCPServer1Execute выполняется в отдельном потоке (thread). 
Из-за этого Memo1.Lines.Add() необходимо делать через синхронизацию. подробнее см. статью "Многопоточность - как это делается в Дельфи" http://forum.vingrad.ru/forum/topic-60076.html
PM MAIL WWW ICQ   Вверх
AndreyZ53
Дата 10.5.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: 1
Всего: 2



Да не думал что так все будет, ну что же буду тогда разбираться, читать и смотреть! Спасибо всем
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
AndreyZ53
Дата 11.5.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: 1
Всего: 2



Вот попробывал сделать через Wirteln/Readln отправляет, но через раз. На кнопку жму отправило, опять жму не отправляет уже, 3 раз жму уже опять отправляет, в чем может быть проблема?
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Romikgy
Дата 11.5.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Код

ошибка в 17 строке.....



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
AndreyZ53
Дата 11.5.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: 1
Всего: 2



Ошибка в 17 строке

Уже нашел

Вот код сервера, который принимает сообщение
Код


procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
read:string;
begin
   read:=AThread.Connection.ReadLn;
   Memo1.Lines.Add('['+TimeToStr(Time)+']'+AThread.Connection.LocalName+' '+read);
   AThread.Connection.WriteLn(AThread.Connection.ReadLn);
   end;



Вот код клиент, который отправляет сообщение
Код

procedure TForm1.Button1Click(Sender: TObject);
var
begin
   IdTCPClient1.WriteLn(Edit1.Text);
   Edit1.Clear;
end;


Почему через раз отправляет сообщение?
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
AndreyZ53
Дата 12.5.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: 1
Всего: 2



Romikgy, так подскажешь почему? Код предоставил 
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
dumb
Дата 12.5.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



смотри пункт 3 в ответе Matematikа
PM MAIL   Вверх
Romikgy
Дата 12.5.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(AndreyZ53 @  11.5.2009,  13:33 Найти цитируемый пост)
begin
   read:=AThread.Connection.ReadLn;
   Memo1.Lines.Add('['+TimeToStr(Time)+']'+AThread.Connection.LocalName+' '+read);
   AThread.Connection.WriteLn(AThread.Connection.ReadLn);
   end;

Код

AThread.Connection.WriteLn(read );


и read это служебное слово не юзай его 
Цитата(AndreyZ53 @  12.5.2009,  13:39 Найти цитируемый пост)
Romikgy, так подскажешь почему? Код предоставил  

я не сижу на форуме постояно!!!

Это сообщение отредактировал(а) Romikgy - 12.5.2009, 18:13


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.