C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ServerSocket, не могу получить строку
Алекс598
Отправлено: 07.05.2005, 15:12


Ученик-кочегар

Группа: Участник
Сообщений: 3



Здравствуйте!
Помогите, кто чем может. У меня на форме есть компонент ServerSocket — прослушивает порт на подключение клиентов и принимает от них строки данных. Подключается клиент — все хорошо, передает мне строку — срабатывает обработчик, что получены данные — тоже все хорошо. НО! сами данные я не вижу. Клиент подключается по инету из проги написанной на Delphi. Получать строку пытаюсь при помощи ReceiveText. Может как-то иначе надо?
Gedeon
Отправлено: 08.05.2005, 11:56


Ветеран

Группа: Модератор
Сообщений: 1742



CODE

TServerSocket::OnClientRead
Алекс598
Отправлено: 08.05.2005, 17:41


Ученик-кочегар

Группа: Участник
Сообщений: 3



Спасибо, но я как раз в обработчике OnClientRead и пытаюсь получить строку:
CODE


void __fastcall TForm3::ServerSocket1ClientRead(TObject *Sender,
     TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
StatusBar1->SimpleText="Данные от клиента получены сервером";
}


Отредактировано Георгий — 09/05/2005, 20:27
codelord
Отправлено: 09.05.2005, 17:50


Не зарегистрирован







Это готовая небольшая чатилка. И обработчики на разные события. Работает отлично. компилировать не пытайся нет файлов формы.
CODE

//---------------------------------------------------------------------------
#include<stdio.h>
#include"read.cpp"
#include <vcl.h>
#pragma hdrstop
#include <Mmsystem.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ServerSocket1->Port=StrToInt(Edit4->Text);
Image4->Left=720;
if (ServerSocket1->Active==false) {ServerSocket1->Active=true;
Button1->Caption="Сервер запущен....";
}
else {ServerSocket1->Active=false;
 Button1->Caption="Локальный Сервер остановлен....";
 Form1->Caption="Клиент отключен.....";
}
/////////////////////////////////////////////////////////////////
if(ServerSocket1->Active==true){char begin[256];
SYSTEMTIME systime;
GetLocalTime(&systime);
sprintf(begin, "Старт сервера %02d:%02d:%02d", systime.wYear, systime.wMonth, systime.wDay);
ListBox1->Items->Add(begin);}
/////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
     TCustomWinSocket *Socket)
{
Form1->Caption="Клиент успешно подключился......";
char begin2[256];
SYSTEMTIME systime;
GetLocalTime(&systime);
sprintf(begin2, "Подключение клиента %02d:%02d:%02d", systime.wHour, systime.wMinute, systime.wSecond);

//////////////////////////////////////////////////////////
ListBox1->Items->Add(begin2);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
     TCustomWinSocket *Socket)
{
SYSTEMTIME systime;
GetLocalTime(&systime);
Edit2->Text=Socket->ReceiveText();
AnsiString resume=Edit2->Text;
AnsiString client="CLIENT";
/////////////////////////////////////////////////////////////
char str[32000];
GetLocalTime(&systime);
sprintf(str, "%s:%02d:%02d:%02d  %s",client, systime.wHour, systime.wMinute, systime.wSecond, resume);
ListBox1->Items->Add(str);
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
SendMessage(ListBox1->Handle, WM_VSCROLL, SB_LINEDOWN, 0);
SendMessage(ListBox1->Handle, WM_VSCROLL, SB_LINEDOWN, 0);
///////////////////////////////////////////////////////

///////////////////////////////////////////////////////
PlaySound("C:\\Windows\\Media\\ringin.wav", NULL, SND_FILENAME);
///////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClientSocket1->Address=Edit3->Text;
ClientSocket1->Port=StrToInt(Edit5->Text);
ClientSocket1->Active=true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClientSocket1->Socket->SendText(Edit1->Text);
ListBox1->Items->Add(Edit1->Text);
Edit1->Text="";
if (ServerSocket1->Active==false) Form1->Caption="Передупреждение отключен сервер на локальном компьютере....";
else Form1->Caption="Работаем";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
     TCustomWinSocket *Socket)
{
Form1->Caption="Клиент отключился......";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit3->Text="127.0.0.1";
Edit4->Text="3000";
Edit5->Text="3000";
}
//---------------------------------------------------------------------------










void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if(Key=='\f'||Key=='\r'||Key=='\n'||Key=='\v'||Key=='\0'){
ClientSocket1->Socket->SendText(Edit1->Text);
AnsiString resum=Edit1->Text;
AnsiString local="LOCAL";
char str[32000];
SYSTEMTIME systime;
GetLocalTime(&systime);
sprintf(str, "%s:%02d:%02d:%02d  %s",local, systime.wHour, systime.wMinute, systime.wSecond,resum);

/////////////////////////////////////////////////////////////////////////

ListBox1->Items->Add(str);
Edit1->Text="";
/////////////////////////////////////////////////////////////////////////
}
if (ServerSocket1->Active==false) Form1->Caption="Передупреждение отключен сервер на локальном компьютере....";
else Form1->Caption="Работаем";
///////////////////////////////////////////////////////////////////////
SendMessage(ListBox1->Handle, WM_VSCROLL, SB_LINEDOWN, 0);
SendMessage(ListBox1->Handle, WM_VSCROLL, SB_LINEDOWN, 0);
///////////////////////////////////////////////////////////////////////

}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
ClientSocket1->Active=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
     TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Label6->Caption="Ошибка подключения к северу!!!";
Image2->Left=16;
Image1->Left=1600;
Image3->Left=1600;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Connecting(TObject *Sender,
     TCustomWinSocket *Socket)
{
Label6->Caption="Подключаемся к серверу.........";
Image1->Left=16;
Image2->Left=1000;
Image3->Left=1000;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
     TCustomWinSocket *Socket)
{
Label6->Caption="Подключено к серверу!!!";
Image3->Left=16;
Image1->Left=1000;
Image2->Left=1000;
///////////////////////////////////////////////////////////

}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
     TCustomWinSocket *Socket)
{
Label6->Caption="Отключены от сервера........";
Image1->Left=1000;
Image3->Left=1000;
Image2->Left=16;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ListBox1->Items->SaveToFile(SaveDialog1->FileName);
FILE *outi,*ini;
outi=fopen("AllLog.log","a");
ini=fopen("LogFile.log","r");
int c;
while((c=getc(ini))!=EOF){
putc(c,outi);
}
fclose(ini);
fclose(outi);
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Image4DblClick(TObject *Sender)
{
ServerSocket1->Active=false;
Image4->Left=1500;
Button1->Caption="Сервер остановлен...";
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
char str[256];
SYSTEMTIME systime;
GetLocalTime(&systime);
sprintf(str, "%02d:%02d:%02d", systime.wHour, systime.wMinute, systime.wSecond);
Edit6->Text=str;        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
read();        
}
//---------------------------------------------------------------------------


Отредактировано Георгий — 09/05/2005, 20:27
Guest
Отправлено: 10.05.2005, 14:59


Не зарегистрирован







Спасибо конечно, но я не понял зачем выкладывать объемный код без смысла. Я просмотрел и понял, что используется в программе функция ReceiveText. Я тоже использую ее, но не работает, в чем мой вопрос и заключается. Я спросил почему может не работать мой код, а Вы привели мне в пример такой же код как у меня, очень разумно!
Gedeon
Отправлено: 10.05.2005, 16:14


Ветеран

Группа: Модератор
Сообщений: 1742



Попробуйте открыть пример билдера, чат по моему и проверьте, если работает — ищите разницу, если нет будем думать дальше.
codelord
Отправлено: 10.05.2005, 19:49


Ученик-кочегар

Группа: Участник
Сообщений: 5



Алекс598, ты был очень любезен. Код был выложен, для того, чтобы ты понял где ты ошибся. Если ты думаешь что ошибиться не мог, глубоко заблуждаешься.

Отредактировано codelord — 10/05/2005, 20:03
codelord
Отправлено: 10.05.2005, 19:53


Ученик-кочегар

Группа: Участник
Сообщений: 5



И если бы ты выложил, полный код ошибка бы нашлась, гораздо быстрее.
Удачи в поиске ошибок. smile.gif

Отредактировано codelord — 10/05/2005, 20:03
codelord
Отправлено: 10.05.2005, 20:05


Ученик-кочегар

Группа: Участник
Сообщений: 5



Так что выкладывай какую-то часть, а не только слоганы. И обязательно разберемся. wink.gif
codelord
Отправлено: 10.05.2005, 20:55


Ученик-кочегар

Группа: Участник
Сообщений: 5



Проблема решилась.
Memo несколько не корректно работает с приемом с socket;
Я ее решил следующим образом:

SYSTEMTIME systime;
AnsiString resume=Socket->ReceiveText();
AnsiString client="CLIENT";
char str[32000];
GetLocalTime(&systime);
sprintf(str, "%s:%02d:%02d:%02d %s",client, systime.wHour, systime.wMinute, systime.wSecond, resume);
Memo1->Lines->Add(str);

Ко всему прочему ты будешь иметь время прихода сообщения.
Если тебя не устраивает ограничение на 32000 символов можешь увеличить.
Да как ты понимаешь этот код нужно вставлять в месте где сервер читает.
И не забудь подключить #include @s\t\d\i\o\.\h@ глючит скрипт блин wink.gif

Отредактировано codelord — 10/05/2005, 21:00
Алекс598
Отправлено: 10.05.2005, 21:49


Ученик-кочегар

Группа: Участник
Сообщений: 3



QUOTE (codelord @ 10/05/2005, 20:55)
Проблема решилась.
Memo несколько не корректно работает с приемом с socket;
Я ее решил следующим образом:

SYSTEMTIME systime;
AnsiString resume=Socket->ReceiveText();
AnsiString client="CLIENT";
char str[32000];
GetLocalTime(&systime);
sprintf(str, "%s:%02d:%02d:%02d  %s",client, systime.wHour, systime.wMinute, systime.wSecond, resume);
Memo1->Lines->Add(str);


Спасибо, я как раз зашел, чтобы сказать, что я тоже разобрался с этим и тоже понял, что некорректная работа мемо с сокетом. Я просто вместо мемо попробовал использовать эдит и все работает — вижу строку. Спасибо за совет и код.
Всем удачи. Увидемся в других темах.
kamelia
Отправлено: 13.06.2005, 17:34


Не зарегистрирован







Ой, спасибо за обсуждение этой темы. У меня тож из-за Memo ничего не получалось. Теперь всё в норме. Спасибо!!!

Вернуться в Вопросы программирования в C++Builder