![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Здравствуйте, у меня такой вопрос:
я пишу приложение по типу клиенты<->сервер, использую компоненты TServerSocket и TClientSocket. Каждый клиент подсоединяется к серверу и присылает ему какие-то данные, структуры(небольшого объема, >100 байт), когда сервер получил данные от клиента, он их должен передать в точно таком же виде всем другим клиентам. Вопрос в том, а правильно ли я реализую это ? P.S. ServerType:=stNonBlocking; Вот как делаю я: Код:
procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket); var Buf:Struct; i:integer; begin Socket.ReceiveBuf(Buf,SizeOf(Buf)); for i := 0 to Server.Socket.ActiveConnections - 1 do if Server.Socket.Connections[i].RemoteAddress<> Socket.RemoteAddress then Server.Socket.Connections[i].SendBuf(Buf,SizeOf(Buf)); end; Меня здесь волнует то, что если например одновременно придет несколько сообщений от разных клиентов правильно ли их обработает сервер и отошлет другим клиентам нужные сообщения, всё ли обработает, всё ли отошлет ? ![]() Пойдет ли такая реализация клиентов/сервера или нужно как-то создавать потоки, что если от одного клиента пришло сообщение, то сервер отправляет это сообщение уже не из этой процедуры, а с другого потока ? И если это нужно именно так, то подскажите пожалуйста, как это должно выглядеть. P.S. Клиентов много не рассчитывается, где-то в районе 2-10. Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей ![]() |
#2
|
||||
|
||||
![]() я бы так сделал рассылку по клиентам:
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var len: Integer; buf: PChar; i: Integer; begin len:=Socket.ReceiveLength; buf:=GetMemory(len); try len:=Socket.ReceiveBuf(buf^, len); for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do if Socket<>ServerSocket1.Socket.Connections[i] then ServerSocket1.Socket.Connections[i].SendBuf(buf^, len); finally FreeMemory(buf); end; end; Пишу программы за еду. __________________ |
#3
|
||||
|
||||
![]() Да, неплохой вариант пересылки по клиентам, мне нравится тоже.
Но вопрос ещё в силе, ответ-то не получил я.. ![]() Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей ![]() |
#4
|
||||
|
||||
![]() ну если все правильно сделать, то все будет Окау. вот можно поиграться:
http://data.cod.ru/89412 Open - "включает" сервер Create - создает 10 клиентов и подключает их SendText - 3 из них посылают сообщения со своим номером в Memo будет рассылка для 10 клиентов. и что правильно, 3 клиента получат рассылку от 2-х, т.е. от самих себя не получат. Пишу программы за еду. __________________ |
#5
|
||||
|
||||
![]() Спасибо, надеюсь, что всё будет работать нормально. Просто хотел знать точно, чтобы потом не пришлось переделывать, если вдруг сейчас что-то неправильно начал делать в области сервера.
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей ![]() |