Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Клиент-Сервер  (Прочитано 14556 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rebel
Гость
« : 13-03-2004 16:57 » 

Необходимо посылать на сервер данные, каждую серунду.
Но есть проблема.
Код клиента
Код:
	...
           j=5;fz=0;
            for (int i=1;i<=j;i++)
                {  ++fz;
                   bitascii=fz;//bitascii - символ таблицы ascii код которого равен fz
Socket->SendText(bitascii);
       Sleep(1000);
                 }
...
Клиент отсылает

А сервер принимает только первые два значения и все.
Код:
...
Memo1->Text=Socket->ReceiveText();
//Полученный символ переводится в 10 сс а потом в 16 сс
//результат записыватся в temp
Memo2->Lines->Add(temp);
...
Если делать все пошагово(F8 ).То все нормально, клиент отправляет, сервер получает.
Не пойму в чем проблема.
« Последнее редактирование: 25-11-2007 12:57 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-03-2004 20:43 » 

rebel, что-то не очень понятно.
Приведи первую программу подробней - что есть bitascii не ясно, а какой тип у Socket?
Что значит "Полученный символ переводится в 10 сс а потом в 16 сс"? Что такое "10 сс" и "16 сс"?
Подумай, ты бы понял такое описание?
Не скупись на описание и не торопись - насколько понятно опишешь, такой и ответ получишь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
stragner
Гость
« Ответ #2 : 14-03-2004 02:37 » 

RXL, по видимому 10 сс - это десятичная система счисления,
16 сс - соответственно шеснадцатеричная
Записан
rebel
Гость
« Ответ #3 : 14-03-2004 07:40 » 

Клиент
Код:
#include <vcl.h>
#pragma hdrstop

#include "client.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char temp[40];//временная
char rec_text[2];//находится полученный символ
char* rec_text2;
int port,bit;//bit- код символа в ascii
int fz=0;//текущее значение температуры устройства
char bitascii;//символ код которого присваивается

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->BitBtn2->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
fz=0;
Form1->BitBtn1->Enabled=false;
Form1->BitBtn2->Enabled=true;

         Edit1->SelectAll();Edit1->GetSelTextBuf(temp,sizeof(temp));Edit1->CopyToClipboard();
         port=atoi(temp);
         Form1->ClientSocket1->Port=port;
         Form1->ClientSocket1->Host=Edit2->Text;
         Form1->ClientSocket1->Address=Edit3->Text;
         ClientSocket1->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Form1->BitBtn2->Enabled=false;
Form1->BitBtn1->Enabled=true;
Form1->Caption="Устройство отключено";
 ClientSocket1->Active=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Connecting(TObject *Sender,
      TCustomWinSocket *Socket)
{
Form1->Caption="Устройство подключено";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
Form1->Caption="Компьютер отключен";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
Memo1->SelectAll();
Memo1->GetSelTextBuf(rec_text,2);
Memo1->CopyToClipboard();
int j;//разность между  bit и fz
        bit=rec_text[0];
        Memo1->Lines->Add(bit);

         j=bit-fz;
            for (int i=1;i<=j;i++)
                {  ++fz;
                   bitascii=fz;
  Form1->ClientSocket1->Socket->SendText(bitascii);
  Memo1->Lines->Add(bitascii);
        Sleep(1000);
                 }

}
//---------------------------------------------------------------------------
Сервер
Код:
#include <iostream.h>
#include <time.h>
#include <dos.h>

#include <vcl.h>
#pragma hdrstop

#include "server.h"
#include "about.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

struct time tt;

int port;//Числовое значение порта
int bit;//код символа в ASCII
char temp[50];//Временная строка в кот. записывается текст, который выводится в Memo2
char rec_text[10];//Принятая строка
char bitascii;//значение символа в  ASCII код которого bit
int x,y,beg;//beg-значение эл-та строки temp начиная с которого в строку записываются данные
char* str;
char* temp2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N5Click(TObject *Sender)
{
Form2->Close();
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
Memo2->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
BitBtn2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{   //Присваивание значений адресов и порт
        Edit1->SelectAll();Edit1->GetSelTextBuf(temp,sizeof(temp));
        Edit1->CopyToClipboard();

        port=atoi(temp);
        Form1->ServerSocket1->Port=port;

         ServerSocket1->Active=true;

BitBtn1->Enabled=false;
BitBtn2->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Form1->Caption="Устройство отключено";
ServerSocket1->Active=false;
BitBtn1->Enabled=true;
BitBtn2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
Form1->Caption="Устройство подключено";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N3Click(TObject *Sender)
{
if (SaveDialog1->Execute())
        |Memo2->Lines->SaveToFile(SaveDialog1->FileName);}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
//Memo2->Font->Color=clRed;
Memo1->Text=Socket->ReceiveText();
Memo1->SelectAll();Memo1->GetSelTextBuf(rec_text,sizeof(rec_text));Memo1->CopyToClipboard();
beg=5;

         temp[0]='<';temp[1]='-';temp[2]='-';temp[3]=' ';temp[4]=' ';

        bit=rec_text[0];
        x=bit/16;y=bit%16;
                switch (x)
                {
                case 10:temp[beg]='A';break;
                case 11:temp[beg]='B';break;
                case 12:temp[beg]='C';break;
                case 13:temp[beg]='D';break;
                case 14:temp[beg]='E';break;
                case 15:temp[beg]='F';break;

                case 9:temp[beg]='9';break;
                case 8:temp[beg]='8';break;
                case 7:temp[beg]='7';break;
                case 6:temp[beg]='6';break;
                case 5:temp[beg]='5';break;
                case 4:temp[beg]='4';break;
                case 3:temp[beg]='3';break;
                case 2:temp[beg]='2';break;
                case 1:temp[beg]='1';break;
                case 0:temp[beg]='0';break;
                };
        beg+=1;
                switch (y)
                  {
                case 10:temp[beg]='A';break;
                case 11:temp[beg]='B';break;
                case 12:temp[beg]='C';break;
                case 13:temp[beg]='D';break;
                case 14:temp[beg]='E';break;
                case 15:temp[beg]='F';break;

                case 9:temp[beg]='9';break;
                case 8:temp[beg]='8';break;
                case 7:temp[beg]='7';break;
                case 6:temp[beg]='6';break;
                case 5:temp[beg]='5';break;
                case 4:temp[beg]='4';break;
                case 3:temp[beg]='3';break;
                case 2:temp[beg]='2';break;
                case 1:temp[beg]='1';break;
                case 0:temp[beg]='0';break;
                };

TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);

Memo2->Lines->Add(str);
Memo2->Lines->Add(temp);
Memo2->Lines->Add("");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
Form1->Caption="Устройство отключено";
}
//---------------------------------------------------------------------------



void __fastcall TForm1::N7Click(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N2Click(TObject *Sender)
{
Memo1->Text=Edit6->Text+Edit7->Text;
Memo1->Lines->Add(Edit8->Text+Edit9->Text);
Memo1->Lines->Add(Edit10->Text+Edit11->Text);
Memo1->Lines->Add(Edit12->Text+Edit13->Text);
Memo1->Lines->Add(Edit14->Text+Edit15->Text);
Memo1->Lines->Add(Edit16->Text+Edit17->Text);
Memo1->Lines->Add(Edit18->Text+Edit19->Text);
Memo1->Lines->Add(Edit20->Text+Edit21->Text);

if (SaveDialog1->Execute())
        |Memo1->Lines->SaveToFile(SaveDialog1->FileName);}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N8Click(TObject *Sender)
{
Memo1->Clear();
if (OpenDialog1->Execute())
        |Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
         temp2=Memo1->Lines->GetText();//Edit2->Text=temp2;
         Edit6->Text=temp2[0];
         Edit7->Text=temp2[1];
         Edit8->Text=temp2[4];
         Edit9->Text=temp2[5];
         Edit10->Text=temp2[8];
         Edit11->Text=temp2[9];
         Edit12->Text=temp2[12];
         Edit13->Text=temp2[13];
         Edit14->Text=temp2[16];
         Edit15->Text=temp2[17];
         Edit16->Text=temp2[20];
         Edit17->Text=temp2[21];
         Edit18->Text=temp2[24];
         Edit19->Text=temp2[25];
         Edit20->Text=temp2[28];
         Edit21->Text=temp2[29];}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button10Click(TObject *Sender)
{
         Edit6->Clear();
         Edit7->Clear();
         Edit8->Clear();
         Edit9->Clear();
         Edit10->Clear();
         Edit11->Clear();
         Edit12->Clear();
         Edit13->Clear();
         Edit14->Clear();
         Edit15->Clear();
         Edit16->Clear();
         Edit17->Clear();
         Edit18->Clear();
         Edit19->Clear();
         Edit20->Clear();
         Edit21->Clear();}
//---------------------------------------------------------------------------

//--------------------------
void convert_send(void)
        {
                switch (rec_text[0])
                {
                case 'A':beg=10*16;break;
                case 'B':beg=11*16;break;
                case 'C':beg=12*16;break;
                case 'D':beg=13*16;break;
                case 'E':beg=14*16;break;
                case 'F':beg=15*16;break;

                case 'a':beg=10*16;break;
                case 'b':beg=11*16;break;
                case 'c':beg=12*16;break;
                case 'd':beg=13*16;break;
                case 'e':beg=14*16;break;
                case 'f':beg=15*16;break;

                case '9':beg=9*16;break;
                case '8':beg=8*16;break;
                case '7':beg=7*16;break;
                case '6':beg=6*16;break;
                case '5':beg=5*16;break;
                case '4':beg=4*16;break;
                case '3':beg=3*16;break;
                case '2':beg=2*16;break;
                case '1':beg=1*16;break;
                case '0':beg=0*16;break;
                };

                switch (rec_text[1])
                  {
                case 'A':beg+=10;break;
                case 'B':beg+=11;break;
                case 'C':beg+=12;break;
                case 'D':beg+=13;break;
                case 'E':beg+=14;break;
                case 'F':beg+=15;break;

                case 'a':beg+=10;break;
                case 'b':beg+=11;break;
                case 'c':beg+=12;break;
                case 'd':beg+=13;break;
                case 'e':beg+=14;break;
                case 'f':beg+=15;break;

                case '9':beg+=9;break;
                case '8':beg+=8;break;
                case '7':beg+=7;break;
                case '6':beg+=6;break;
                case '5':beg+=5;break;
                case '4':beg+=4;break;
                case '3':beg+=3;break;
                case '2':beg+=2;break;
                case '1':beg+=1;break;
                case '0':beg+=0;break;
                };
bitascii=beg;
Form1->ServerSocket1->Socket->Connections[0]->SendText(bitascii);
        }
//----------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit6->Text+Edit7->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit6->Text+Edit7->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

convert_send();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit8->Text+Edit9->Text);
 Memo2->Lines->Add("");

 Edit2->Clear();
 Edit2->Text=Edit8->Text+Edit9->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();
convert_send();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit10->Text+Edit11->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit10->Text+Edit11->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

 convert_send();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit12->Text+Edit13->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit12->Text+Edit13->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

 convert_send();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit14->Text+Edit15->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit14->Text+Edit15->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

 convert_send();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{

TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit16->Text+Edit17->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit16->Text+Edit17->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

 convert_send();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)
{

TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit18->Text+Edit19->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit18->Text+Edit19->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

 convert_send();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button8Click(TObject *Sender)
{

TDateTime DateTime = Time();  // store the current date and time
  AnsiString str = TimeToStr(DateTime);
Memo2->Lines->Add(str);
 Memo2->Lines->Add("--> "+Edit20->Text+Edit21->Text);
 Memo2->Lines->Add("");

 Edit2->Text=Edit20->Text+Edit21->Text;
 Edit2->SelectAll();Edit2->GetSelTextBuf(rec_text,sizeof(rec_text));
 Edit2->CopyToClipboard();

 convert_send();
}
//---------------------------------------------------------------------------
Смысл проги такой: сервер-компьютер, клиент-устройство. Необходимо съмулировать работу компа и устройства. В данном случае устройство-печка.Начальное значение температуры 0C.Сервер отправляет число(температуру) на которую печка соответственно должна нагреться.значения темпр. в сервере вводится в 16 с.с., после чего я это число преобразую в символ ascii и шлю. Клиент получает, получает значение температуры получив код символа и в цикле он наращивает температуру до заданной и каждый раз отправиляет на сервак.
« Последнее редактирование: 25-11-2007 13:00 от Алексей1153++ » Записан
rebel
Гость
« Ответ #4 : 14-03-2004 07:40 » 

Самое интересное:
Если я посылаю значение 5 или 6. Клиент начинает с 0 набирает значения до 5 или 6 и отсылает каждое значение через 1 секунду.Сервер высвечивает только пришедшие 1 и 2.
Если пошлю >6 сервер Первые 5 секунд сервер молчит, а потом показывает всё как мне необходимо, каждую секунду принимает значение и показывает его....
Как это объяснить???
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 14-03-2004 12:11 » 

Зачем устраивать такой длинный путь для данных:
Цитата
Код:
Memo1->Text=Socket->ReceiveText();
Memo1->SelectAll();
Memo1->GetSelTextBuf(rec_text,sizeof(rec_text));
Разве нельзя было сразу в переменную поместить, а потом уже в Memo1 заганять? Графическая оболочка предназначена для общения с пользователем, а не для хранения данных. Я бы не доверял GUI. Сдается мне, быстрее всего, тут то собака и порылась. Да и программа тоже нуждается в упрощении.
« Последнее редактирование: 25-11-2007 13:02 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
rebel
Гость
« Ответ #6 : 14-03-2004 15:55 » 

Цитата
Да и программа нуждается в упрощении
Я только начинаю, и  конечно много ошибок. Если не сложно укажите на них. Пордскажите каким образом можно было решить ты или иную ситуацию.  Жжешь

Разобрался. Проблема была вот где.
Было
Код:
Memo1->Lines->Add(Socket->ReceiveText()); 
Memo1->SelectAll();
Memo1->GetSelTextBuf(rec_text,2);
Memo1->CopyToClipboard();
Так вот
Код:
Memo1->CopyToClipboard):;
Не нужен, из-за него то и не получалось каждую секунду получить данные. Как убрал- все заработало как по маслу.

Спасибо за терпение и усилия по разборке моего "сочинения"


Цитата
Разве нельзя было сразу в переменную поместить, а потом уже в Memo1 заганять?
Я пробовал. Но он ругается. Не хочет делать
Код:
rec_text=Socket->ReceiveText();
даже если rec_text будет указателем на строку, и под него будет выделено место в памяти.
« Последнее редактирование: 25-11-2007 13:04 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 14-03-2004 19:51 » new

rebel, многое можно сократить - меньше текста, легче будет разбираться. Для начала:
Код:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
............
beg=5;
         temp[0]='<';temp[1]='-';temp[2]='-';temp[3]=' ';temp[4]=' ';
        bit=rec_text[0];
        x=bit/16;y=bit%16;
                switch (x)
                {
                case 10:temp[beg]='A';break;
                case 11:temp[beg]='B';break;
                case 12:temp[beg]='C';break;
...........
                case 1:temp[beg]='1';break;
                case 0:temp[beg]='0';break;
                };
В первом приближении: т.к. temp - символьный массив, а x - int, то предоставим всю работу компилятору - заменим switch() :
Код:
   temp[beg]=(char)x;
Если капнуть глубже, то становится понятно что нужен перевод числа в hex-строку. Тут еще сокращаем:
Код:
  snprintf(temp,sizeof(temp),"<-- %02X",(int)rec_text[0]);
Далее - ф-ия void convert_send(void) :
1) два блока switch() заменяем на:
Код:
sscanf)rec_text,"%jx",&beg:;
2)
Код:
Form1->ServerSocket1->Socket->Connections[0]->SendText(bitascii);
bitascii имеет тип char, а в SendText() понимает char, или ему нужен char* ? Тут ничего не буду утверждать - CBuilder-а у меня нет.

Ф-ии snprintf() и sscanf() описаны в заголовке stdio.h.

Цитата
Я пробовал. Но он ругается. Не хочет делать
Код:
rec_text=Socket->ReceiveText();
даже если rec_text будет указателем на строку, и под него будет выделено место в памяти.
Так точно не получится - разные типы. И значение заранее созданному массиву так присвоить нельзя - только копированием.
Посмотри какой тип возвращает ReceiveText(), создай переменную этого типа, прими в нее текс и сконвертируй его в строку (наверняка такая ф-ия есть).

И самое главное: я понимаю, что CBuilder позволяет делать окна/кнопки и легко ими управлять, но коли язык С++, то начни с его изучения. Особенно почитай про типы данных.
« Последнее редактирование: 25-11-2007 13:07 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines