Алекс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
|
И если бы ты выложил, полный код ошибка бы нашлась, гораздо быстрее.
Удачи в поиске ошибок.
Отредактировано codelord — 10/05/2005, 20:03 |
|
codelord |
Отправлено: 10.05.2005, 20:05 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 5
|
Так что выкладывай какую-то часть, а не только слоганы. И обязательно разберемся. |
|
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@ глючит скрипт блин
Отредактировано 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 ничего не получалось. Теперь всё в норме. Спасибо!!! |
|
|