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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2012, 18:06   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Delphi7:TServerSocket - скорость передачи

Доброго времени суток.
На базе TServerSocket и TClientSocket создано простейшее приложение Клиент-Сервер.
Передаём файл в 200Мб одним потоком.
Клиент и Сервер находятся на одном компьютере.
Через Файрвол смотрю скорость; она с 20Мб/с плавно падает до 200Кб/с
Почему?
Как управлять скоростью? (если это возможно)
Или как удерживать скорость на каком-то одном значении?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 19.12.2012, 19:25   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

без кода никак... может у тебя processmessages после каждого чиха
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 20.12.2012, 02:52   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Server

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ms:TMemoryStream;
begin
if Socket.ReceiveText='send' then
 begin
  ms:=TMemoryStream.Create;
  try
   ms.LoadFromFile('C:\123.exe');
   ms.Position:=0;
   Socket.SendText(IntToStr(ms.Size)+#0);
   Socket.SendStream(ms);
  except
   ms.Free;
  end;
 end;
end;

Client

Код:
procedure TForm1.ClientSocket1Connect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin
Socket.SendText('send');
end;
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  s, sl: string;
begin
s:= Socket.ReceiveText;
if not Reciving then
 begin
  SetLength(sl,StrLen(PChar(s))+1);
  StrLCopy(@sl[1],PChar(s),Length(sl)-1);
  DataSize:=StrToInt(sl);
  Data:=TMemoryStream.Create;
  Delete(s,1,Length(sl));
  Reciving:=true;
 end;

try
 Data.Write(s[1],length(s));
 if Data.Size=DataSize then
  begin
   Data.Position:=0;
   data.SaveToFile('D:\123.exe');
   Data.Free;
   Reciving:=false;
   Socket.Close;
  end;
except
 Data.Free;
end;

end;
Этот метод передачи взят с просторов нэта давным давно, использую во многих своих программах, но на больших объёмах видимо не подходит...
Всё гениальное - просто!

Последний раз редактировалось Air; 20.12.2012 в 02:56.
Air вне форума Ответить с цитированием
Старый 20.12.2012, 09:03   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Забудь ReceiveText!

клиент и сервер в блоке, качается 3 сек

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    ClientSocket1: TClientSocket;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
  private
    { Private declarations }
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TMySocketThread=class(TServerClientThread)
  protected
    procedure ClientExecute; override;
  end;

{ TMySocketThread }

procedure TMySocketThread.ClientExecute;
var
  s:string;
  Stream:TFileStream;
begin
  SetLength(s,256);
  SetLength(s,ClientSocket.ReceiveBuf(s[1],length(s)));
  if s<>'send' then exit;
  Stream:=TFileStream.Create('d:\notes_v_.rar',fmOpenRead);
  ClientSocket.SendText(IntToStr(Stream.Size)+#0);
  ClientSocket.SendStream(Stream);
end;

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  SocketThread:=TMySocketThread.Create(false,ClientSocket);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket1.Active:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Socket: TClientSocket;
  s,sl:string;
  DataSize:integer;
  Data:TFileStream;
  t:dword;
begin
  t:=GetTickCount;
  Socket:=TClientSocket.Create(nil);
  try
    Socket.ClientType:=ctBlocking;
    Socket.Host:='127.0.0.1';
    Socket.Port:=3333;
    Socket.Open;
    Socket.Socket.SendText('send');

    SetLength(s,256);
    SetLength(s,Socket.Socket.ReceiveBuf(s[1],length(s)));
    SetLength(sl,StrLen(PChar(s))+1);

    StrLCopy(@sl[1],PChar(s),Length(sl)-1);
    DataSize:=StrToInt(sl);
    Delete(s,1,Length(sl));

    Data:=TFileStream.Create('d:\notes_v_.rar___',fmCreate);
    try
      Data.WriteBuffer(s[1],length(s));
      SetLength(s,1024*16);
      while Data.Size<DataSize do
        Data.WriteBuffer(s[1],Socket.Socket.ReceiveBuf(s[1],length(s)));
    finally
      Data.Free;
    end;
  finally
    Socket.Free;
  end;
  t:=GetTickCount-t;
  Application.MessageBox(PChar(IntToStr(t)),'',0);
end;

end.
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 21.12.2012, 06:06   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Slym
Ух ты)
Стабильно на 9-12 Мб/с в три прихода передал 209Мб. Благодарю за предоставленный метод.
Никогда не задумывался о типе ctBlocking в чём отличие?

_
ThreadCacheSize установил в 512, так скорость вообще 32Мб/с была))
Всё гениальное - просто!

Последний раз редактировалось Air; 21.12.2012 в 06:13.
Air вне форума Ответить с цитированием
Старый 29.12.2012, 20:03   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Slym
Ух ты)
Стабильно на 9-12 Мб/с в три прихода передал 209Мб. Благодарю за предоставленный метод.
Никогда не задумывался о типе ctBlocking в чём отличие?

_
ThreadCacheSize установил в 512, так скорость вообще 32Мб/с была))
твоя скорость соответствует 100мбит...
ThreadCacheSize оставь в покое... это кеш созданных TMySocketThread (чтоб не пересоздавать постоянно) и должно примерно равняться среднему количеству одновременных подключений по дефолту 10 что достаточно, а зачастую даже избыточно
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 29.12.2012, 23:04   #7
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Slym
Ммм, ясно, значит случайное совпадение.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TServerSocket, TClientSocket. Создание сокета для передачи файлов. Denutrror Работа с сетью в Delphi 5 03.06.2012 11:08
Ошибки передачи файлов (TServerSocket -> TClientSocket) Cold_Night Работа с сетью в Delphi 2 26.11.2009 17:43
Органичить скорость передачи Denager Работа с сетью в Delphi 22 05.03.2008 09:08
Скорость передачи приема Лубышев Работа с сетью в Delphi 1 05.02.2008 10:14