Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.04.2009, 15:32
Aless Aless вне форума
Прохожий
 
Регистрация: 13.04.2009
Сообщения: 26
Репутация: 10
По умолчанию Server Socket и ClientSocket в Delphi7

Народ!Help me!Я тут писал одну прогу с компонентами из Delphi такими как :ServerSocket и ClientSocket.Мне кажется,они есть в 3,4,5, дельфях.Но у меня стоит седьмая,и их в ней нет!Там есть какие-то TcpClient &Server.Пробовал использовать их,но уних недоступен ряд таких функций как:SendText , ReceiveText(в Событиях их нет) и другое.Расширение Socket он вообще не воспринимает(например TcpClient.Socket).Подскажите как мне их заставить правильно работать,или в седьмой дельфи они объявляются по-другому?
Ответить с цитированием
  #2  
Старый 13.04.2009, 15:57
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Без паники, ServerSocket и ClientSocket в семёрке есть. Только по умолчанию не установлены. Сделай
Component => Install Packages => Add => "C:/.../.../Delphi7/Bin/", и там файлик "dclsockets7.bpl"... Сокеты должны появиться.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 13.04.2009 в 16:00.
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
thoril3144857 (17.08.2017)
  #3  
Старый 13.04.2009, 18:49
Aless Aless вне форума
Прохожий
 
Регистрация: 13.04.2009
Сообщения: 26
Репутация: 10
По умолчанию

Спасибо огромное,popyurv!Прогу за пять минут нарезал.А то неделю тупил с этим TcpServer и К°.
Ответить с цитированием
  #4  
Старый 23.04.2009, 14:42
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

Напишу в этой теме пожалуй свой вопрос по сокетам: как организовать схему взаимодействия клиент-сервер на этих компонентах так, чтобы когда включается сервер, автоматически подсоединялись клиенты. Дело в том, что клиентские прогаммы являются резидентными на компьютерах-клиентах и не имеют пользовательского интерфейса )
Ответить с цитированием
  #5  
Старый 23.04.2009, 14:55
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от alexnov
Напишу в этой теме пожалуй свой вопрос по сокетам: как организовать схему взаимодействия клиент-сервер на этих компонентах так, чтобы когда включается сервер, автоматически подсоединялись клиенты. Дело в том, что клиентские прогаммы являются резидентными на компьютерах-клиентах и не имеют пользовательского интерфейса )
ну дык мне кажется тут всё просто, создай окно приёма сообщений, таймер (API'вский) и каждый, например, 5 минут проверяй, робит ли серв.
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #6  
Старый 23.04.2009, 15:32
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

сделал примерно так, только не 5 минут а 1 сек:
Цитата:
procedure TForm1.TimerConnectionTimer(Sender: TObject);
begin
if ClientSocket1.Active=false then
try
ClientSocket1.Active:=true;
except
ShowMessage('no connection');
end;

end;

Вроде и работает, тока потом при простое около часа выдает сообщения что типа буфер сокета слишком мал или типа того каждую секунду.
Ответить с цитированием
  #7  
Старый 23.04.2009, 15:40
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от alexnov
сделал примерно так, только не 5 минут а 1 сек:


Вроде и работает, тока потом при простое около часа выдает сообщения что типа буфер сокета слишком мал или типа того каждую секунду.
во первых зачем каждую секунду? утечка памяти, ищи, какой то буфер переполняется, а больше 2 гигов незя
во вторых ошибки Client\ServerSocket обрабатывай событием OnError, Active никаких Raise он не поднимает
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #8  
Старый 24.04.2009, 08:18
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

Сделал 5 секунд, а какой там буфер если я тока ClientSocket поставил на форму?
Ответить с цитированием
  #9  
Старый 24.04.2009, 09:18
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от alexnov
Сделал 5 секунд, а какой там буфер если я тока ClientSocket поставил на форму?
значит где то в другом месте утечка, обычно утечки бывают когда прогер забывает уничтожать временные переменные, например:
Код:
procedure Timer1Timer(Sender: TObject);
var
  list: TStringList;
begin
  list := TStringList.Create;
  list.Add('AAA');
  list.Add('BBB');
  list.Add('CCC');
  Memo1.Lines.Assign(list);
  //и вот на следущей строке не написать то что там написано - происходит утечка
  list.Free;
end;
смотри у себя в коде
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #10  
Старый 28.04.2009, 10:19
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

С этой ошибкой справился, но теперь другая иногда вылезает: Access violation adress... что то такое, главное не пойму изза чего, иногда вылазит только при простое. как отследить?
Ответить с цитированием
  #11  
Старый 28.04.2009, 10:37
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от alexnov
С этой ошибкой справился, но теперь другая иногда вылезает: Access violation adress... что то такое, главное не пойму изза чего, иногда вылазит только при простое. как отследить?
это уже ты чота с памятью мудриш, например вызов ещё не созданного обьекта. Это специфичное, тут уже код нужен если сам неможеш разобратся
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #12  
Старый 04.05.2009, 08:16
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

Привожу код программы, т.к. самостоятельно локализовать ошибку не удалось:

Юнит:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, inifiles, MSI_Common, MSI_Monitor, MSI_Memory, MSI_Machine,
  MSI_Display, MSI_SMBIOS, MSI_CPU, MSI_Storage, MSI_Software, MSI_Network,
  MSI_MSProduct, MSI_OS, xpman, ScktComp, sSkinProvider, sSkinManager,
  ExtCtrls;

type
  TForm1 = class(TForm)
    MiTeC_Monitor1: TMiTeC_Monitor;
    Button1: TButton;
    Memo1: TMemo;
    MiTeC_Machine1: TMiTeC_Machine;
    MiTeC_Memory1: TMiTeC_Memory;
    MiTeC_Display1: TMiTeC_Display;
    MiTeC_SMBIOS1: TMiTeC_SMBIOS;
    MiTeC_CPU1: TMiTeC_CPU;
    MiTeC_Storage1: TMiTeC_Storage;
    MiTeC_Software1: TMiTeC_Software;
    MiTeC_Network1: TMiTeC_Network;
    MiTeC_MSProduct1: TMiTeC_MSProduct;
    MiTeC_OperatingSystem1: TMiTeC_OperatingSystem;
    ClientSocket1: TClientSocket;
    Memo2: TMemo;
    Edit3: TEdit;
    Button3: TButton;
    sSkinManager1: TsSkinManager;
    sSkinProvider1: TsSkinProvider;
    Button2: TButton;
    TimerConnection: TTimer;
    Memo3: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TimerConnectionTimer(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure FormActivate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  comp_name:string;
  ini : TIniFile;

implementation

uses MiTeC_WinIOCTL;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var c,i,t:integer;
s:string;
begin
MiTeC_Machine1.RefreshData;

Memo1.Lines.Add('Имя компьютера: '+ MiTeC_Machine1.MachineName);
comp_name:=MiTeC_Machine1.MachineName;   //запоминаем имя компа
MiTeC_Network1.RefreshData;
Memo1.Lines.Add('IP: '+MiTeC_Network1.IPAddresses.Text);

//for I := 0 to  - 1 do

Memo1.Lines.Add(' ');

MiTeC_Monitor1.RefreshData;
Memo1.Lines.Add('Монитор');
Memo1.Lines.Add( 'Название: '+MiTeC_Monitor1.Monitors[0].DeviceDesription);
Memo1.Lines.Add( 'Производитель: '+MiTeC_Monitor1.Monitors[0].Manufacturer);
Memo1.Lines.Add( 'Модель: '+MiTeC_Monitor1.Monitors[0].Model);
Memo1.Lines.Add( 'Серийный номер: '+MiTeC_Monitor1.Monitors[0].ProductNumber);
Memo1.Lines.Add( 'Имя: '+MiTeC_Monitor1.Monitors[0].Name);
Memo1.Lines.Add( 'EDID v.= '+MiTeC_Monitor1.Monitors[0].EDID_Version);

Memo1.Lines.Add(' ');
Memo1.Lines.Add( 'Оперативная память');
 MiTeC_Machine1.RefreshData;
 MiTeC_Memory1.RefreshData;

   c:=0;
t:=(MiTeC_Memory1.PhysicalTotal div 1024) div 1024;
Memo1.Lines.Add( 'Всего: '+inttostr(t)+' Мб');

    with MiTeC_Machine1.SMBIOS do begin
      if MemoryDeviceCount>0 then begin
        for i:=0 to MemoryDeviceCount-1 do
          if (MemoryDevice[i].Size>0) then begin

           Memo1.Lines.Add(Format('Слот %d - %d Мб %s',[i,MemoryDevice[i].Size,s]));
          end;
      end else
        for i:=0 to MemoryModuleCount-1 do
          if (MemoryModule[i].Size>0) and (c<t) then begin
            c:=c+MemoryModule[i].Size;


            Memo1.Lines.Add(Format('Слот %d - %d Мб %s',[i,
                                                           MemoryModule[i].Size,
                                                           GetMemoryTypeStr(MemoryModule[i].Types)]));
          end;
    end;

Memo1.Lines.Add(' ');
MiTeC_Display1.RefreshData;
Memo1.Lines.Add('Видеокарта: ' + MiTeC_Display1.Adapter +' '+ floattostr(MiTeC_Display1.Memory/1024/1024)+ ' Мб');

Memo1.Lines.Add(' ');
Memo1.Lines.Add('Материнская плата: ' );
MiTeC_SMBIOS1.RefreshData;
Memo1.Lines.Add(MiTeC_SMBIOS1.MainBoardManufacturer+' '+MiTeC_SMBIOS1.MainBoardModel);
//Memo1.Lines.Add('Серийный номер: '+MiTeC_SMBIOS1.MainBoardSerial);   //дата

Memo1.Lines.Add(' ' );
Memo1.Lines.Add('Процессор: ' );
MiTeC_CPU1.RefreshData;
Memo1.Lines.Add(MiTeC_CPU1.MarketingName+', S/N: '+MiTeC_CPU1.SerialNumber);

Memo1.Lines.Add(' ' );
Memo1.Lines.Add('HDD: ');
MiTeC_Storage1.RefreshData;
for i:=0 to MiTeC_Storage1.PhysicalCount-1 do
   if not(MiTeC_Storage1.Physical[i].Removable) then
     if not(MiTeC_Storage1.Physical[i].DeviceType in [FILE_DEVICE_CD_ROM,FILE_DEVICE_DVD, FILE_DEVICE_TAPE,FILE_DEVICE_UNKNOWN])  then
           Memo1.Lines.Add(MiTeC_Storage1.Physical[i].Model+' ('+ floattostr(MiTeC_Storage1.Physical[i].Size div 1024 div 1024 div 1024) +' Гб)');


Memo1.Lines.Add(' ');

Memo3.Lines.Add('Программное обеспечение: ');
MiTeC_Software1.RefreshData;
 for i:=0 to MiTeC_Software1.Count-1 do
      if (MiTeC_Software1.InstallEntry[i].Version<>'') then
         Memo3.Lines.Add(MiTeC_Software1.InstallEntry[i].Name+' v.'+MiTeC_Software1.InstallEntry[i].Version )
         else  Memo3.Lines.Add(MiTeC_Software1.InstallEntry[i].Name);

Memo3.Lines.Add(' ' );
Memo3.Lines.Add('OC: ');
MiTeC_OperatingSystem1.RefreshData;
Memo3.Lines.Add(MiTeC_OperatingSystem1.OSName+' '+MiTeC_OperatingSystem1.OSEdition+' build '+inttostr(MiTeC_OperatingSystem1.BuildNumber));
Memo3.Lines.Add('Дата установки: '+DateToStr(MiTeC_OperatingSystem1.InstallDate));
Memo3.Lines.Add('ID: '+MiTeC_OperatingSystem1.ProductID);
Memo3.Lines.Add('Key: '+MiTeC_OperatingSystem1.ProductKey);

Memo3.Lines.Add(' ' );
Memo3.Lines.Add('ПО Microsoft: ');
MiTeC_MSProduct1.RefreshData;
for I := 0 to MiTeC_MSProduct1.ProductCount-1 do
  Memo3.Lines.Add(MiTeC_MSProduct1.Products[i].Name+', ID: '+MiTeC_MSProduct1.Products[i].ProductID+
  ', Key: '+  MiTeC_MSProduct1.Products[i].ProductKey);




  end;








procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=true;

end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Memo2.Lines.Insert(0,'Connected');
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Memo2.Lines.Insert(0,'Disconnected');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  recv_text, s:string;
  i:integer;
  f:TStringList;
begin
  recv_text:=Socket.ReceiveText;
  Memo2.Lines.Insert(0,'Message received from SERVER');
  Memo2.Lines.Insert(0,'> '+recv_text);


  if recv_text=comp_name then
  begin
  f:=TStringList.Create;
  //f.LoadFromFile(Edit1.Text);// Загрузка текстового файла
  f.Text:=Memo1.Text+memo3.Text;
  // Button1.Click;
  ClientSocket1.Socket.SendText(f.Text);
//  ClientSocket1.Socket.SendText(Memo3.Text);
  end;

f.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    if ClientSocket1.Active=true then
  ClientSocket1.Socket.SendText(Memo1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

Ini:=TIniFile.Create(GetCurrentDir+'\settings.ini');
ClientSocket1.Host:=ini.ReadString('connection', 'server', 'ALEXNOV');
ClientSocket1.Port:=strtoint(ini.ReadString('connection', 'port', '1025'));
Ini.Free;
Button1.Click;


end;

procedure TForm1.TimerConnectionTimer(Sender: TObject);
begin
if ClientSocket1.Active=false then
try
  ClientSocket1.Active:=true;
except
 ShowMessage('no connection');
end;

  end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
ErrorCode := 0; // теперь сообщение об ошибке при отсутствии сервера не будет вываливаться
end;





procedure TForm1.FormActivate(Sender: TObject);
begin
ShowWindow(Handle,SW_HIDE);
ShowWindow(Application.Handle,SW_HIDE);
end;

end.

Проект:
Код:
program INPC_Client;

uses
  Forms, windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
 MutexHandle : THandle;
const
 MutexName = 'INPC_Client_appl';
begin
  // Пробуем открыть Mutex по имени
  MutexHandle := OpenMutex(MUTEX_ALL_ACCESS, false, MutexName);
  if MutexHandle <> 0 then begin
   // Копия нашего приложения уже запущена - Mutex уже есть
   CloseHandle(MutexHandle);
   MessageBox(0,'Программа уже была запущена!','INPC Client: Ошибка!', 0);
   halt;
  end;
  // Создание Mutex
  MutexHandle := CreateMutex(nil, false, MutexName);
  Application.Initialize;
  Application.Title := 'INPC Client';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  // Уничтожаем наш Mutex при завершении приложения
  CloseHandle(MutexHandle);
 end.
Ответить с цитированием
  #13  
Старый 07.05.2009, 16:43
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

Что значит эта ошибка??!??!
Изображения
Тип файла: gif Безымянный2.GIF (9.2 Кбайт, 30 просмотров)
Ответить с цитированием
  #14  
Старый 07.05.2009, 16:55
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от alexnov
Что значит эта ошибка??!??!
это значит что буфер переполнен причины могут быть разные, установлен маленький его обьём, адресат не отвечает...
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #15  
Старый 13.05.2009, 08:11
alexnov alexnov вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от AleD
это значит что буфер переполнен причины могут быть разные, установлен маленький его обьём, адресат не отвечает...
ну да адресат не отвечает - у меня по таймеру прога всегда пытается приконнектиться к серверу.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter