Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.26;
Скачать: CL | DM;

Вниз

ClientSocket, ServerSocket - несколько отправок   Найти похожие ветки 

 
cyborg ©   (2002-07-22 14:53) [40]

Какой один, какой другой клиент?
В один сокет приходит, в одном и разделяется всё. И все сообщения получаются, а не только первое. Этот код хоть 100 склееных сообщений разделит.


 
cyborg ©   (2002-07-22 14:55) [41]

panov © про разделители в строке мы тут обсуждали уже, работать будет, но всё таки .... короче обсуждали уже :)


 
Fredericco ©   (2002-07-22 16:39) [42]

2cyborg ©
У тебя только один клиент?
У меня нет. И важно что бы каждый получил таки свое сообщение.
А на счет разделителя в строке, мой собственный протокол построен так, что клиент только свое и заберет.
У меня структура системы такая, чот один клиент посылает серверу комманду: пошли клиенту такому-то такое-то сообщение. И если в тоже мнгновение получится: пошли клиенту другому-то такое-то сообщение. То сообщение придет первому и сдвоенное. Вот почему я использую алгоритм описанный мной выше.

> ИМХО для разных задач разный способ.



 
Fredericco ©   (2002-07-22 16:51) [43]

Так. Я не прав. Думал только о клиентах. То что я придумал - можно проще, так как вы советуете. Сорри, что спорил.
Встает вопрос.
Скажем есть на сервере единая процедура обработки сообщения пришедшего от клиентов.
procedure TextReceiveFromClient(const Text:string);
Вот сервер получил сдвоенное сообщение, разделил его на два, как дальше поступить? Ведь нужно сначал вызвать процедуру с первым сообщением, а потом со вторым? Как быть?


 
cyborg ©   (2002-07-22 17:08) [44]

Делается так:
Procedure ProcessData( передаваемые данные; var Socket : TWinSocket);
Begin
//обрабатываем данные если нужно посылаем Socket что требуется
End;


дальше из моего примера

repeat
Move(StringReceive[1],ReceiveCheck,4);
Move(StringReceive[5],DataSize,4);
if ReceiveCheck=Check then //Если признак начала правильный
if DataSize+8<=Length StringReceive then
begin //Если сообщение не обрезанное
SetLength(StringMessage,DataSize);
Move(StringReceive[9],StringMessage[1],DataSize);
Delete(StringReceive,1,DataSize+8);
ProcessData( StringMessage, Socket);
end
else Quit:=True
else Quit:=True;
until quit;


 
Brand   (2002-07-22 17:35) [45]

А вот и я, автор.
Блин, я уже давно все сделал и забыл про эту тему. А вот зашел, шляжу, а тут такое..................
Граждане, спокойствие, только спокойствие.


 
Fredericco ©   (2002-07-22 19:09) [46]

cyborg ©
Может я ошибаюсь и сейчас (конец рабочего дня - простительно), но на стороне сервера ИМХО, прием данных делать как ты сказал, а отправку по моему способу. Тогда и клиентское сообщение не потеряется на сервере (твой способ) и каждому клиенту дойдет его сообщение (мой способ).
Ежели что не так, критекуй!


 
cyborg ©   (2002-07-22 20:03) [47]

С этим кодом работает как сервер так и клиент, сокет то в принцпе такой же, только сервер ждёт когда к нему подключатся, а клиент подключается, у меня чат работает по такому принципу, что сервер, что клиенты, каждая мессага идёт в свою трубу, никакие сокеты между собой по идее не смешиваются, когда сервер посылает одному клиенту, это сообщение никак не может придти в непредназначенный сокет. Если бы так было, как ты говоришь, то при отправке из сервера мессаг всем клиентам, то все вместе мессаги приходили бы только первому попавшемуся клиенту?
Я понимаю так, что при подключении клиента к серверу сервер создает новый сокет и никак данные из одного сокета не могут попасть в другой сокет, если только сам сервер не посылает им данные.
Лучше конечно сделать с sendbuf но в строке удобно то, что можно легко обратиться к определённому байту string[x] поэтому я так сделал, в принципе sendbuf и sendtext одно и тоже, sendtext использует тот же SendBuf, сам в исходниках посмотри. Ctrl держи и мышкой на функции нажимай, если у тебя пути прописаны к библиотекам модулей, то перескочишь на исходный текст той функции.


 
Fredericco ©   (2002-07-23 10:38) [48]

2cyborg ©
Ты прав. У меня просто не совсем стандартное пременнение сокетов, и структура сети, моей, тоже спецефичная, поэтому такие идеи и рождались.


 
Alibaba ©   (2002-07-25 11:09) [49]

> Brand
Ты ж акуратненько с такими вопросами... :)


 
Alex SV ©   (2002-07-25 11:11) [50]

> Brand
Так расскажи нам как ты реализовал отправку?


 
Володя Шарапов   (2002-07-25 11:15) [51]

Я тут почитал как предлагают организовать пересылку.
Попробовал с использованием разделительных символов - у меня получилось.



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

Текущий архив: 2002.09.26;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.019 c
1-85544
eLVik
2002-09-12 18:36
2002.09.26
Как удалить компонент его обработчиком?


4-85750
Донской
2002-08-09 21:41
2002.09.26
broadcastsystemmessage() послыет 5 сообщений вместо одного


3-85310
AFrolov
2002-09-06 15:25
2002.09.26
Сортировка набора данных


3-85373
uncleRu
2002-09-04 17:22
2002.09.26
dbExpress


4-85779
DarkSimpson
2002-08-07 17:43
2002.09.26
Замена стандартной панели задач и system-tray ю