Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Indy Servers/Clients


Автор: Newline5000 4.12.2012, 11:31
Cобственно постановка задачи:

Нужно чтобы с некоторого количества рабочих мест можно было обмениваться текстовыми сообщениями с одним сервером. В мемо/edit пишем, жмем send - отправляем. Сервер получает сообщение, что-то там с ним делает и шлет обратно. После чего обрывает соединение 

Вопрос:

В Embarcadero С++ Builder XE нет компонента Server Socket и его же клиента. Его заменили Indy компонентами. Подскажите как реализуется такая схема работы? Можно ли где-то найти исходники/примеры?


Автор: Newline5000 4.12.2012, 13:36
Победил. Сделал так:
Сервер:
Код

void __fastcall TForm1::IdTCPServer1Connect(TIdContext *AContext)
{
  Form1->Memo1->Lines->Add("К нам подключились");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
  Form1->Memo1->Lines->Add("К нам подключились");
  String ReceivedLine;
  ReceivedLine=AContext->Connection->Socket->ReadLn();
  Form1->Memo1->Lines->Add(ReceivedLine);
  AContext->Connection->Socket->WriteLn("Сервером получена строка "+ReceivedLine);
  AContext->Connection->Disconnect();
  Form1->Memo1->Lines->Add("Отключение");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Disconnect(TIdContext *AContext)
{
  Form1->Memo1->Lines->Add("От нас отключились");


Клиент:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Form1->IdTCPClient1->Host=Form1->Edit1->Text;
  Form1->IdTCPClient1->Connect();
  Form1->IdTCPClient1->Socket->WriteLn(Form1->Edit2->Text);
  Form1->Edit2->Text="";
  Form1->Memo1->Lines->Add(Form1->IdTCPClient1->Socket->ReadLn());
  Form1->IdTCPClient1->Disconnect();
}


Вопрос:
Какого хрена кириллические символы отображаются в виде знаков вопроса?

Автор: feodorv 6.12.2012, 11:53
Цитата(Newline5000 @  4.12.2012,  14:36 Найти цитируемый пост)
Какого хрена кириллические символы отображаются в виде знаков вопроса? 

Может, локаль прописать?

Автор: artsb 6.12.2012, 12:13
Потому что, нужно использовать юникодные строки?
Код

Form1->Memo1->Lines->Add(L"К нам подключились");

Автор: Salatovec 17.12.2012, 16:19
Цитата(Newline5000 @  4.12.2012,  13:36 Найти цитируемый пост)
Победил. Сделал так:


Дружище, а расскажи пожалуйста, что нужно писать в Edit1->Text у клиента. Там имя хоста, но как узнать какое имя прописать?

Автор: artsb 17.12.2012, 21:13
Цитата(Salatovec @  17.12.2012,  16:19 Найти цитируемый пост)
Дружище, а расскажи пожалуйста, что нужно писать в Edit1->Text у клиента. Там имя хоста, но как узнать какое имя прописать?

IP-адрес сервера пропишите.

Автор: Salatovec 18.12.2012, 14:52
Цитата(artsb @  17.12.2012,  21:13 Найти цитируемый пост)
IP-адрес сервера пропишите. 


В виде: 255.255.255.255 ?

Автор: artsb 18.12.2012, 17:49
Цитата(Salatovec @  18.12.2012,  14:52 Найти цитируемый пост)
В виде: 255.255.255.255 ?

Ага. Тот который у вашего сервера.

Автор: Salatovec 19.12.2012, 09:29
Цитата(artsb @  18.12.2012,  17:49 Найти цитируемый пост)
Ага. Тот который у вашего сервера. 


Так, отлично, спасибо - заработало. Но осталась проблема, как у автора темы - отсылаемое сообщение приходит на сервере не в виде ПРИВЕТ, а в виде ??????.

Автор: artsb 19.12.2012, 09:46
Цитата(Salatovec @  19.12.2012,  09:29 Найти цитируемый пост)
Так, отлично, спасибо - заработало. Но осталась проблема, как у автора темы - отсылаемое сообщение приходит на сервере не в виде ПРИВЕТ, а в виде ??????.

Очевидно, проблемы с кодировкой. Либо приводите клиента и сервера к общему "знаменателю" (используйте одну и туже кодировку). Либо при отправке указывайте, в какой кодировке идут данные, а на сервере проверяйте кодировку и делайте соответствующие преобразования.

Автор: Salatovec 19.12.2012, 14:12
artsb, а Вы можете подсказать, что за загадочный TEncoding кроется в 

Код

    Form1->IdTCPClient1->Socket->WriteLn(Form1->Edit2->Text);


Я передаю туда UnicodeString, но чую, что это не верно.

Автор: artsb 19.12.2012, 15:49
С Indy работал мало, так что, тяжело что-то подсказать. Нужно самому разбираться.
Могу посоветовать такой вариант:
- определитесь с кодировкой, которой будете пользоваться
- отправляйте в сокет сначала длину данных (в вашем случае строки) в байтах
- затем, следом отправляйте сами данные в виде массива байт
- на принимающей стороне получаете размер данных в байтах
- выделяете место для буфера с требуемым размером
- читаете пришедшие данные

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)