![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Спасибо, надеюсь, что всё будет работать нормально. Просто хотел знать точно, чтобы потом не пришлось переделывать, если вдруг сейчас что-то неправильно начал делать в области сервера.
|