Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2011, 15:47   #1
who i
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 18
По умолчанию ServerSocket и ClientSocket медленные?

прога которая удаленно передвигает курсор мышки, по локалке. пользуюсь сокетами, но когда в клиентском приложении которое каждую долю секунды (по таймеру = 50)пересылает на сервер координаты курсора сокет начинает тупить и загонять в одну стринговую переменную сразу несколько значений что приводит к сбою когд ставлю OnTimer => 300 то все нормально но тогда курсор двигается рывками, Вывод Сокет медленно работает) или я чтото натупил вот код сервера:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, Buttons, StdCtrls;

type
  TForm1 = class(TForm)
    Server: TServerSocket;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton1: TSpeedButton;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  q:char;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Server.Active:=true;
q:='0';
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
form1.Hide;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Server.Active:=false;
end;

procedure TForm1.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
str,x,y:string;
i,j:integer;
cur:TPoint;

begin
x:='';
y:='';
str:=socket.ReceiveText;
for i:=1 to length(str) do
begin
label3.Caption:=str;
if str[i]<>'_' then x:=x+str[i];
if str[i]='_' then break;
end;

for j:=i+1 to length(str)-2 do y:=y+str[j];
cur.X:=strtoint(x); label1.Caption:=x;
cur.Y:=strtoint(y); label2.Caption:=y;
SetCursorPos(cur.X,cur.Y);

if str[length(str)] = '1' then
if q = '1' then begin q:='0';
mouse_event(mouseeventf_absolute or mouseeventf_move, cur.x, cur.y, 0, 0); end
else
mouse_event(mouseeventf_absolute or mouseeventf_leftdown, cur.x, cur.y, 0, 0)
else begin q:='1'
mouse_event(mouseeventf_absolute or mouseeventf_leftup, cur.x, cur.y, 0, 0); end;
end;

end.
клиент

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Sockets, ExtCtrls, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Port: TEdit;
    Label2: TLabel;
    Ip: TEdit;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Client: TClientSocket;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
client.Port:=strtoint(port.Text);//считываем порт
client.Address:=ip.Text;//считываем айпишник
client.Active:=true;// попытка приконектится
timer1.Enabled:=true;//запуск таймера
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=false;
client.Close;
client.Active:=false;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
client.Close;
client.Active:=false;
end;

procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
form1.Caption:='Connected!';
end;

procedure TForm1.ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
form1.Caption:='DisConnected!';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
cur:TPoint;// tut budut xranitsya koordinatu kursora
l:byte;
begin
GetCursorPos(cur); // zadaem koordinatu kursora
if GetKeyState(VK_LBUTTON) < 0 then
 l:=1 else
l:=0;
label4.Caption:=inttostr(GetKeyState(VK_LBUTTON));
client.Socket.SendText(IntToStr(cur.X)+'_'+IntToStr(cur.y)+'_'+inttostr(l));
end;

end.
посоветуйте плиз тогда другой протокол или укажите на мои ошибки?
who i вне форума Ответить с цитированием
Старый 25.01.2011, 16:41   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

На ошибки не укажу, лень разбираться, но я бы поднял UDP руками, там 7 строчек кода на клиенте и 8 на сервере.

TCP плох, когда данные нужно передавать в режиме реального времени, особенно, когда потеря некоторого процента пакетов не смертельна. В принципе в локалке TCP должен работать быстро, так что скорей всего виноваты ваши руки. Но если дело дойдёт до тырнета, TCP ещё выйдет вам боком.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.01.2011, 16:45   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)учитывая что TCP потоковый, вы можете принять два пакета(две ваших строки) сразу.(а то и больше)
2)текстовый вид ждя данных не самое оптимальное решение
3)сказано выше)
4)лучше всего организовать свои пакеты(свой протокол так сказать)
тогда шансов куда больше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.01.2011, 16:50   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Дурней затеи чем отслеживание тек.координат мыши по таймеру не придумать.
Еще более чудовищней затея - передавать координаты в строковом представлнении.
Про непонимание логики работы компонентов в асинхр.режиме и принципа поточности ТСР вообще нет слов.

Логику - в топку. Код туда же.
mss вне форума Ответить с цитированием
Старый 25.01.2011, 17:25   #5
who i
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Дурней затеи чем отслеживание тек.координат мыши по таймеру не придумать.
Еще более чудовищней затея - передавать координаты в строковом представлнении.
Про непонимание логики работы компонентов в асинхр.режиме и принципа поточности ТСР вообще нет слов.

Логику - в топку. Код туда же.
а ты я гляжу умный ? ну так разъясни , кроме воды в твоем посте не увидел ничего !!!

интересно а как бы ты отслеживал?

Последний раз редактировалось who i; 25.01.2011 в 17:28.
who i вне форума Ответить с цитированием
Старый 25.01.2011, 17:39   #6
who i
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
1)учитывая что TCP потоковый, вы можете принять два пакета(две ваших строки) сразу.(а то и больше)
2)текстовый вид ждя данных не самое оптимальное решение
3)сказано выше)
4)лучше всего организовать свои пакеты(свой протокол так сказать)
тогда шансов куда больше.

не подскажете как организовывать свои пакеты(можно ссылкой)
who i вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
serversocket-clientsocket ben95 Работа с сетью в Delphi 10 20.01.2011 08:28
ClientSocket и ServerSocket Hacker19_90 Работа с сетью в Delphi 1 23.03.2010 01:17
ClientSocket и ServerSocket KoBRaAndrey Работа с сетью в Delphi 4 08.01.2010 19:21
ServerSocket и ClientSocket Sensizu Работа с сетью в Delphi 5 30.12.2009 00:09
Serversocket,clientsocket prizrak1390 Работа с сетью в Delphi 10 21.04.2009 16:04