|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Server Socket и ClientSocket в Delphi7
Народ!Help me!Я тут писал одну прогу с компонентами из Delphi такими как :ServerSocket и ClientSocket.Мне кажется,они есть в 3,4,5, дельфях.Но у меня стоит седьмая,и их в ней нет!Там есть какие-то TcpClient &Server.Пробовал использовать их,но уних недоступен ряд таких функций как:SendText , ReceiveText(в Событиях их нет) и другое.Расширение Socket он вообще не воспринимает(например TcpClient.Socket).Подскажите как мне их заставить правильно работать,или в седьмой дельфи они объявляются по-другому?
|
#2
|
||||
|
||||
Без паники, 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
|
|||
|
|||
Спасибо огромное,popyurv!Прогу за пять минут нарезал.А то неделю тупил с этим TcpServer и К°.
|
#4
|
|||
|
|||
Напишу в этой теме пожалуй свой вопрос по сокетам: как организовать схему взаимодействия клиент-сервер на этих компонентах так, чтобы когда включается сервер, автоматически подсоединялись клиенты. Дело в том, что клиентские прогаммы являются резидентными на компьютерах-клиентах и не имеют пользовательского интерфейса )
|
#5
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#6
|
|||
|
|||
сделал примерно так, только не 5 минут а 1 сек:
Цитата:
Вроде и работает, тока потом при простое около часа выдает сообщения что типа буфер сокета слишком мал или типа того каждую секунду. |
#7
|
||||
|
||||
Цитата:
во вторых ошибки 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
|
|||
|
|||
Сделал 5 секунд, а какой там буфер если я тока ClientSocket поставил на форму?
|
#9
|
||||
|
||||
Цитата:
Код:
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
|
|||
|
|||
С этой ошибкой справился, но теперь другая иногда вылезает: Access violation adress... что то такое, главное не пойму изза чего, иногда вылазит только при простое. как отследить?
|
#11
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#12
|
|||
|
|||
Привожу код программы, т.к. самостоятельно локализовать ошибку не удалось:
Юнит: Код:
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
|
|||
|
|||
Что значит эта ошибка??!??!
|
#14
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#15
|
|||
|
|||
Цитата:
|