Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Tserversocket не принимает коннект и сообщения   Найти похожие ветки 

 
OFP   (2006-01-31 22:14) [0]

Доброго всем дня....

Делаю простую программу клиент - сервер для своих целей ...

И у меня возникли ряд вопросов и проблем.
По порядку:

1. На сервере.

Разместил serv : TServerSocket
- установил ему порт 45500
- serv.active:=true; ( запустил сервер )

Теперь когда, я соединяюсь с клиента, то у меня срабатывае на сервере следующие обработчики событий по порядку:

GetSocket --> Accept ---> GetThread ---> ThreadStart и все ...

Обработчик события - ClientConnect у меня не срабатывает...

соотвественно сервер, не видит когда клиент отсоединяется ...

если я с клиента посылаю любое текствое сообщение короткое, то сервер просто виснет....
если я с сервера, пытаюсь отправить сообщение к клиенту, который вроде соединился то он пишет, что все удачно, но ни чего не происходит.... вот ....

вот код сервера....

{РАБОТАЕТ}
procedure TFormMain.FormShow(Sender: TObject);
begin
ServerSocket.Port:=50;
ServerSocket.Active:=true;
ServerSocket.Open;
end;

{РАБОТАЕТ}
procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ServerSocket.Active then Server.Free;
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin

MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Клиент принят: "+Socket.RemoteAddress+
" handle: "+IntToStr(ServerSocket.Socket.SocketHandle));

end;

{ ТУТ НЕ РАБОТАЕТ }
procedure TFormMain.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" -Клиент присоединился ("+Socket.RemoteAddress+")");

end;

{ ТУТ НЕ РАБОТАЕТ }
procedure TFormMain.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Клиент отсоединился ("+Socket.RemoteAddress+")");

end;

{??????}
procedure TFormMain.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Ошибка ("+Socket.RemoteAddress+")"+" - code error:"+IntToStr(ErrorCode));
end;

{ ТУТ НЕ РАБОТАЕТ }
procedure TFormMain.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
MessageText : string;
begin
MessageText := Socket.ReceiveText;
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Сообщение от клиента- ("+
Socket.RemoteAddress+"): "+ MessageText);
end;

{ отправка сообщение клиентам - НЕ РАБОТАЕТ }
procedure TFormMain.ButtonSendMessageClick(Sender: TObject);
var
i: Integer;
begin
if ServerSocket.Socket.ActiveConnections = 0 then
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Нет соединений.");

for i := 0 to ServerSocket.Socket.ActiveConnections-1 do
begin
ServerSocket.Socket.Connections[i].SendText(EditTextMessage.Text);
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Êëèåíòó "+ServerSocket.Socket.Connections[i].RemoteAddress+" ñîîáùåíèå ïîñëàííî.");
end;
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
begin

MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Получить сокет, IDSocket: "+IntToStr(Socket));
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Получить поток.");
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Закрыть поток.");
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Запустить поток.");
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketListen(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+" - Слушаем потрт: "+IntToStr(ServerSocket.Port));
end;

Подскажите, где что надо исправить или дописать чтоб сервер, начал нормально работать....

Заранее большое спасибо !


 
OFP   (2006-02-01 01:06) [1]

прикол... ни когда бы не подумал..., но проблема решилась,
в что в ServerType (сервера и клиента) нужно поставить - stNonBlocking
и сразу нормальный конект


 
Digitman ©   (2006-02-01 08:34) [2]


> нужно поставить - stNonBlocking
> и сразу нормальный конект


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

Замени обращение к MemoStatusServer на потокобезопасную ф-цию MessageBox() и убедись в том что все транспортные события возбуждаются сервером в должном порядке.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
2-1147607318
Ray
2006-05-14 15:48
2006.05.28
Работа со шрифтом


2-1147271681
Adios
2006-05-10 18:34
2006.05.28
Как вычесть из строки?


2-1147458565
Succube
2006-05-12 22:29
2006.05.28
Сумма


2-1147185339
HBZ
2006-05-09 18:35
2006.05.28
Использование DLL


2-1147515507
2006_A
2006-05-13 14:18
2006.05.28
Реогирование на кнопку "windows"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский