Тема: сеть
Показать сообщение отдельно
  #4  
Старый 30.06.2010, 15:47
norfolk23 norfolk23 вне форума
Прохожий
 
Регистрация: 15.06.2010
Сообщения: 10
Репутация: 10
По умолчанию

пробовал оба.че т не идет у мя(


Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TServerThread = class(TServerClientThread) // клас многопоточного сервера
    protected
      procedure ClientExecute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TServerThread.ClientExecute;
var
  bufIn: array [0..65535] of Char; // буфер для входящих данных
  fRSData: TWinSocketStream; // клиентский поток
  buf_size: integer; // размер входящего буфера
  bufOut: TMemoryStream; // приёмный буфер в памяти
begin
  bufOut := TMemoryStream.Create; // создаём приёмный буфер в памяти
  inherited // наследуем все свойства от родителя
  FreeOnTerminate := True; // освобождать память при завершении потока
  fRSData := TWinSocketStream.Create(ClientSocket, 100000); // создаём клиентский
  try
    while (not Terminated) And (ClientSocket.Connected) do // работаем пока есть коннект или пока не закрылись
    begin
      if fRSData.WaitForData(12000) = False then Break; // если за 2 минуты ничего не пришло, закрывает поток
      buf_size := ClientSocket.ReceiveLength; // размер входящего буфера

      if buf_size = 0 then Break; // если входящий буфер = 0, то закрываемся

      fRSData.ReadBuffer(bufIn,buf_size); // читаем буфер
      BufOut.Write(bufIn,buf_size); // пишем буфер в память, для последующего сохранения в файл
      bufOut.SaveToFile('LogForServer.txt'); // сохраняем лог
      bufOut.Free; // освобождаем память от данных
    end;

    except
    on e:exception do // если произошла ошибка
      begin
        ClientSocket.Close; // закрываем соединение с клиентом
        Terminate; // остановка
      end;
    end;
  fRSData.Free; // освобождаем память от клиентского потока
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket1.Active := True; // активируем серверную часть
end;

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  SocketThread := TServerThread.Create(False, ClientSocket); // создаём отдельный поток
  SocketThread.Priority := tpLower; // ставим ему низкий приоритет, высокий не нужен
end;


end.
Ответить с цитированием