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

Вниз

Сокеты   Найти похожие ветки 

 
Ivolg ©   (2006-08-04 19:51) [0]

Всем привет ! У меня возникла такая проблема с TServerSocket и TClientSocket... Вообщем при передаче какого-нибудь текста, принимается у меня он иногда с каракулями... Например посылаю: Client.Socket.SendText("90"), сервер принемает не число 90, а їРї9Р0ї... Помогите пожайлуста, в чем может быть проблема ? Спасибо...


 
kami ©   (2006-08-04 20:05) [1]

Как принимаешь, код давай.


 
Ivolg ©   (2006-08-04 20:13) [2]

>kami ©   (04.08.06 20:05) [1]

Как принимаешь, код давай.


Как обычно...


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
  Msg: String;
  I: Integer;
begin
  Msg:=Socket.ReceiveText;
  I:=StrToInt(Msg);
end;

end.


 
kami ©   (2006-08-04 20:28) [3]

Только что (в пределах одного приложения) посмотрел - все передается без искажений.


 
kami ©   (2006-08-04 20:56) [4]

Забыл архи-сложный код :)
procedure TForm1.FormCreate(Sender: TObject);
begin
 ss:=TServerSocket.Create(Self);
 ss.Port:=1256;
 ss.OnClientRead:=ssClientRead;
 ss.Active:=True;

 cs:=TClientSocket.Create(Self);
 cs.Address:="127.0.0.1";
 cs.Port:=1256;
 cs.Active:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 cs.Socket.SendText(Edit1.Text);
end;

procedure TForm1.ssClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
 Edit2.Text:=Socket.ReceiveText;
end;


Пытался как только мог - отправлял и много текста, и циклом, так и не смог добиться того, чтобы принялось что-то не то, что отправлял :)) (да и невозможно это, если не брать в расчет склейку и разбиение по пакетам)


 
Ivolg ©   (2006-08-04 23:00) [5]

Вот это кусок куда из моего чата, который передается с искажениями:

Серверная часть:


procedure TForm1.ServerClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 S: string;
 i: Integer;
begin
   S:=Socket.ReceiveText;
   if  Copy(s,1,7)="Status\" then begin
   Delete(s,1,7);
   ListBox1.Items.Add(s); // Добавляем юзера в список
   S:="Ul\";
   for i:=0 to ListBox1.Items.Count-1 do
   S:=S+ListBox1.Items[i]+";"; // Разделяем каждый ник знаком ;
   for i:=0 to Server.Socket.ActiveConnections-1 do
   Server.Socket.Connections[i].SendText(S);
end;
end;
procedure TForm1.ServerClientConnect(Sender: TObject;
 Socket: TCustomWinSocket);
var
  i: Integer;
begin
    listbox1.Clear;
    for i:=0 to Server.Socket.ActiveConnections-1 do
    Server.Socket.Connections[i].SendText("Status\"); // Посылаем клиенту запрос на получение его ника
end;

end.


Клиентская часть:


procedure TForm1.ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
   S: String;
   it: TListItem;
begin
  S:=Socket.ReceiveText;
  if  Copy(s,1,3)="Ul\" then begin
  Delete(s,1,3);
  lv.Clear;
  while Pos(";",s) > 0 do begin
  it:=lv.Items.Add;
  it.Caption:=Copy(s,1,Pos(";",s)-1);
  Delete(s,1,Pos(";",s));
end;
end;
  if copy(s,1,7)="Status\" then begin
  delete(s,1,7);
  client.Socket.SendText("Status\"+edit1.Text); // Посылаем серверу свой ник
end;
end;


Когда когда заходят больше 3-4 клиентов в чат, то у одних показывается что юзеров 6-8, у других получается такая вещь:

User
User
User
Ul/User
User
Ul/User
User
User

Иного даже вместо Ников, добовляются всякие каракули...


 
kami ©   (2006-08-04 23:29) [6]

Ага, а вот тут уже нужно учитывать разбиение и склейку пакетов.
Пример - подключается клиент (при уже подключенных нескольких). Тогда начинается отправка всем известным полного списка ников (причем - с каждым новым ответом "Status\" данных в каждое гнездо посылается все больше и больше). Вот и получается, что при сравнительно большой занятости сети может быть следующее :
Сервер отправил "Ul\1;2;3...6;" и (после еще одного ответа клиента)"Ul\1;2;3;...6;7;".
При передаче эти два сообщения склеились, и на клиент пришло : "Ul\1;2;3...6;Ul\1;2;3;...6;7;", а могло и так (тоже к примеру) :"Ul\1;2;3...6;Ul\1;2" + ";3;...6;7;".
А теперь посмотри, как это обрабатывают твои сервер с клиентами :) Никак. А нужно.
Почитай, например, http://www.delphimaster.ru/articles/sockets/index.html


 
Ivolg ©   (2006-08-05 00:43) [7]

>kami ©

Собственно эта статья мне ничем не помогла :\


 
Ketmar ©   (2006-08-05 09:44) [8]

> [7] Ivolg ©   (05.08.06 00:43)

тебе же пояснили. если ты отправил 100 байт, то совсем не обязательно клиент получит именно эти 100 и именно сразу. он может получить их любыми кусками. порядок сохранится, но не более.


 
Ivolg ©   (2006-08-05 16:03) [9]

Можете посоветовать\подсказать как исправить эту проблему ?


 
Ketmar ©   (2006-08-05 16:53) [10]

> [9] Ivolg ©   (05.08.06 16:03)

а) не использовать сеть вообще;
б) сделать нормальный протокол и разбирать его;
в) использовать уже готовые компоненты для чата.


 
Ivolg ©   (2006-08-05 17:22) [11]

>Ketmar ©   (05.08.06 16:53) [10]

б, в - варианты мне походят, вопрос: где взять уже готовые компоненты для чата ?


 
Ketmar ©   (2006-08-05 19:52) [12]

TVyChat (было у Кабана -- http://cobans.net/). в Indy есть IRC. может, и ещё есть, с ходу вспоминать лень.


 
Ivolg ©   (2006-08-05 20:45) [13]

>Ketmar ©   (05.08.06 19:52) [12]

Спасибо ОГРОМНОЕ... Буду юзать )


 
Ivolg ©   (2006-08-05 22:17) [14]

>Ketmar ©   (05.08.06 19:52) [12]

А этот компонент, только на локальном хосте работает ?


 
Ivolg ©   (2006-08-07 13:08) [15]

Кто-нибдуь работал с этим компонентом ?



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

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

Наверх





Память: 0.49 MB
Время: 0.063 c
15-1153485865
McSimm
2006-07-21 16:44
2006.08.27
Продолжение ветки "Для любителей коммунизъъма (TUser)"


2-1154810751
RGB
2006-08-06 00:45
2006.08.27
Справочник


15-1154345465
QuickFinder
2006-07-31 15:31
2006.08.27
КПК и питание от сети


2-1154612736
yon
2006-08-03 17:45
2006.08.27
Прорисовка в StringGrid


2-1155026269
Hadroran
2006-08-08 12:37
2006.08.27
Даже не знаю как тему назвать





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский