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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
8-1140765122
Maka
2006-02-24 10:12
2006.08.27
как заставить играть mp3 файл ....


2-1154787406
Reaktor
2006-08-05 18:16
2006.08.27
Как изменить цвет объекта Button?


1-1152862745
Calibr2
2006-07-14 11:39
2006.08.27
Как добавить таймер на форму в VBA редакторе


2-1154649037
Балбес
2006-08-04 03:50
2006.08.27
Из стринга в чар


3-1150649448
Merry
2006-06-18 20:50
2006.08.27
Сохранение Query