PDA

View Full Version : معادل دستورات در Indy 10



MOJTABAATEFEH
شنبه 22 مهر 1391, 07:21 صبح
سلام دوستان عزیز لطفا اگر کسی اطلاعی دارد بفرمایید معادل دستورات زیر در

Indy 10 (Delphi Xe2(

چیست؟

ممنون

AThread.Connection.LocalName
AThread.Terminated
AThread.Connection.ReadBuffer(Parameter)
TIdPeerThread(Hand.Thread).Connection.WriteBuffer( Parameter)

Var
Com : TDataTransform;
Transfer : TDataTransform;

IdTCPClient1.ReadBuffer(Transfer, SizeOf (Transfer));
IdTCPClient1.WriteLn('!'+Trim(Edit3.Text));
IdTCPClient1.WriteBuffer(Com, SizeOF(Com), True);




البته میدونم که مثلا برای یکسری دستورات در Indy 10 بعد از Connection از IOHandler استفاده میشه
در ضمن منظور از Parameter پارامترهای مورد نیاز است که مشکلی با این مورد نیست

MOJTABAATEFEH
دوشنبه 24 مهر 1391, 06:48 صبح
یعنی هیچکس با Indy 10 کار نکرده!

BORHAN TEC
دوشنبه 24 مهر 1391, 08:08 صبح
سلام
من تجربه کار با Indy 9 را ندارم ولی سعی می کنم که معادل آنها را در نسخه 10 بنویسم:
AThread.Connection.LocalName
اگر منظور به دست آوردن نام کامپیوتر مهمان باشد باید از کد زیر استفاده کنید:
AContext.Connection.IOHandler.Host;

++++++++++++++++++++++++++++++

AThread.Terminated
معادل:
AContext.Free;

++++++++++++++++++++++++++++++

AThread.Connection.ReadBuffer(Parameter)
معادل:
AContext.Connection.IOHandler.ReadBytes(Buffer, Count, AppendState);

++++++++++++++++++++++++++++++

TIdContext در Indy 10 معادل TIdPeerThread در Indy 9 است.

++++++++++++++++++++++++++++++

MOJTABAATEFEH
دوشنبه 24 مهر 1391, 08:43 صبح
کد برنامه
مشکل در در خطوطی هست که کلمه Problem جلوی آن است (خط 263 و 331) البته در اینجا کد اصلی Indy 9 رو آوردم در جائی نیاز بوده TIdPeerThread را به TIdContext تبدیل کردم و میماند مابقی سطرهای مشخص شده با کلمه Problem



unit MainServer;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, ToolWin, DB, DBTables, StdCtrls, XPMan,
Grids, DBGrids, IdAntiFreezeBase, IdAntiFreeze, Winsock
, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls,
IdSocketHandle {Use Unit Indy Socket}, IdTCPConnection, Menus, IdContext,
IdThreadComponent, IdCustomTCPServer ;

{$HINTS OFF}
{$WARNINGS OFF}

Type
PClient =^ TClient;
TClient = Record //Object for holding connected user
Dns,Name : String; //Host name and user name
Thread : Pointer; //Hold a pointer of thread's user
End;


type
TMain1 = class(TForm)
StatusBar1: TStatusBar;
ImageList1: TImageList;
ImageList2: TImageList;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
UserTable1: TTable;
UserTable1Username: TStringField;
UserTable1Password: TStringField;
GroupBox1: TGroupBox;
XPManifest1: TXPManifest;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
GroupBox2: TGroupBox;
ListBox1: TListBox;
GroupBox3: TGroupBox;
Memo1: TMemo;
TCPServer1: TIdTCPServer;
IdAntiFreeze1: TIdAntiFreeze;
PopupMenu1: TPopupMenu;
DisconnetThis1: TMenuItem;
PopupMenu2: TPopupMenu;
MenuItem1: TMenuItem;
IdThreadComponent1: TIdThreadComponent;
procedure ToolButton7Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton4Click(Sender: TObject);
procedure ToolButton6Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure DisconnetThis1Click(Sender: TObject);
procedure MenuItem1Click(Sender: TObject);
procedure TCPServer1Execute(AContext: TIdContext);
procedure TCPServer1Disconnect(AContext: TIdContext);
procedure TCPServer1Connect(AContext: TIdContext);
private
{ Private declarations }
public
{ Public declarations }
QClients : TThreadList;
Function ActiveServer : Boolean; //Activate Server
Function DeActiveServer : Boolean; //DeActive Server
Procedure Connecting(UserName,DNS : String; Thread : Pointer); //Connecting to server
Procedure Disconnecting(Thread : Pointer; Data : TObject; UserName : String); //Disconnecting from server
Function CheckPassword(Thread : Pointer; UserName,Passwords : String) : Boolean; //Check user password
Procedure SendMessageToClient(UserName, Reciever, Messages : String); //Send to other client from this client
end;

var
Main1: TMain1;

implementation

Uses Settings, Users, GlobalUnit {Type Of Packet};

{$R *.dfm}

procedure TMain1.ToolButton7Click(Sender: TObject);
begin
DeActiveServer;
Application.Terminate;
end;

procedure TMain1.ToolButton5Click(Sender: TObject);
begin
Application.Minimize;
end;

function TMain1.ActiveServer: Boolean; //Activate Server
Var
IP,Port : String;
Binding : TIdSocketHandles;
begin
Try
IP := Trim(Settings1.Edit1.Text);
Port := Trim(Settings1.Edit2.Text);
Binding := TIdSocketHandles.Create(Self);
Binding.Insert(0);
Binding.Items[0].IP := IP;
Binding.Items[0].Port := StrToInt(Port); //Set IP, Port Address
TCPServer1.Bindings := Binding;
TCPServer1.Active := True;
StatusBar1.Panels.Items[0].Text := ' Status : Connected';
Binding.Free;

Result := TCPServer1.Active;
Except
ShowMessage('Error : your config is wrong.');
TCPServer1.Active := False;
End;
end;

procedure TMain1.ToolButton3Click(Sender: TObject);
begin
Settings1.ShowModal;
end;

procedure TMain1.ToolButton1Click(Sender: TObject);
begin
ActiveServer;
end;

function TMain1.DeActiveServer: Boolean;
begin
Try
IF ListBox1.Items.Count = 0 Then
Begin
TCPServer1.Active := False;
TCPServer1.Bindings.Clear;
StatusBar1.Panels.Items[0].Text := ' Status : Disconnected';

Result := TCPServer1.Active;
End
Else
ShowMessage('Some users are online.');
Except
End;
end;

procedure TMain1.ToolButton2Click(Sender: TObject);
begin
DeActiveServer;
end;

procedure TMain1.ToolButton4Click(Sender: TObject);
begin
Newuser1.ShowModal;
end;

procedure TMain1.ToolButton6Click(Sender: TObject);
begin
MessageDlg('Chat server demo ,mtInformation,[mbOK],0);
end;

procedure TMain1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IF TCPServer1.Active Then
IF MessageDlg('Are you sure you want shutdown server?',mtConfirmation,[mbOK,
mbCancel],0) = mrok Then
Begin
Action := caFree;
End
Else
Action := caNone;
end;

procedure TMain1.Connecting(UserName, DNS: String; Thread: Pointer);
Var
NewClient : PClient;
I : Integer;
begin
New(NewClient);

IF UserName[1] = '!' Then
Delete(UserName,1,1);

NewClient.Name := Trim(UserName);
NewClient.DNS := DNS;
NewClient.Thread := Thread;

For I := 0 To ListBox1.Items.Count - 1 Do //Conflict with other user
Begin
IF ListBox1.Items.Strings[I] = UserName Then
Begin
TIdContext(Thread).Connection.Disconnect;
Memo1.Lines.Add('Conflict in user : '+UserName);

Break;
End;
End;
//Connect client and add thread
TIdContext(Thread).Data := TObject(NewClient);

Try
QClients.LockList.Add(NewClient);
Finally
QClients.UnlockList;
End;

ListBox1.Items.Add(UserName);

Memo1.Lines.Add('Connected '+UserName);
Memo1.Lines.Add('DNS : '+DNS);

end;

procedure TMain1.TCPServer1Connect(AContext: TIdContext);
Var
Usernames : String;
begin
Usernames := AContext.Connection.IOHandler.ReadLn();
Connecting(Usernames,AContext.Binding.PeerIP,ACont ext); //Connecting Client
end;

procedure TMain1.TCPServer1Disconnect(AContext: TIdContext);
Var
Dis : PClient;
begin
Dis := PClient(AContext.Data); //Disconnect User
Disconnecting(AContext,AContext.Data,Dis.Name);
end;

procedure TMain1.Disconnecting(Thread: Pointer; Data: TObject;
UserName: String);
Var
ActClient : PClient;
begin
ActClient := PClient(Data);

Memo1.Lines.Add('Disconnect User : '+ActClient.Name);

Try
QClients.LockList.Remove(ActClient); //Disconnect client and remove thread
Finally
QClients.UnlockList;
End;

ListBox1.Items.Delete(ListBox1.Items.IndexOf(ActCl ient.Name));

TIdContext(Thread).Data := Nil;
end;

procedure TMain1.TCPServer1Execute(AContext: TIdContext);
Var
Command : AnsiChar;
Packet : TDataTransform;
begin
IF {Not (AContext.f)) And} (AContext.Connection.Connected) Then
Begin
AThread.Connection.ReadBuffer(Packet,SizeOF(Packet )); //Recieve data from client //Problems

Command := Packet.Command[1]; //Give command

Case Command OF //Case for command action

'!' : //Command for connection
Begin
IF CheckPassword(AContext,Packet.UserName,Packet.Pass word) Then //Check Password
End;

'#' :
Begin
IF (Packet.UserName <> '') And (Packet.Recieve <> '') Then
Begin
SendMessageToClient(Packet.UserName,Packet.Recieve ,Packet.Text); //Send Message to other client
End
Else
End;

End;
End;
end;

function TMain1.CheckPassword(Thread: Pointer; UserName,
Passwords: String): Boolean;
begin
With UserTable1 Do
Begin
IF Locate('Username',Trim(UserName),[]) Then //Password is not true
Begin
IF Not (Passwords = UserTable1Password.AsString) Then
Begin
TIdContext(Thread).Connection.Disconnect;
Result := False;
End
Else
Result := True;
End
Else //Username not found
Begin
TIdContext(Thread).Connection.Disconnect;
Result := False;
End;
End;
end;

procedure TMain1.SendMessageToClient(UserName, Reciever, Messages: String);
Var
I : Integer;
Hand : PClient; //Send to other client from this client
TransferMessage : TDataTransform;
begin
Memo1.Lines.Add('Char of Message : '+IntToStr(length(Messages))+' '+UserName+' ' +
'-> '+Reciever);
Try
With QClients.LockList Do
Begin //Find and send to other client
For I := 0 To Count - 1 Do
Begin
Hand := Items[I];
IF Hand.Name = Trim(Reciever) Then
Begin
TransferMessage.Command := '#SENDMESSAGE';
TransferMessage.UserName := Trim(UserName);
TransferMessage.Recieve := Trim(Reciever);
TransferMessage.Text := Messages;
TIdContext(Hand.Thread).Connection.IOHandler.Write BufferOpen;
TIdPeerThread(Hand.Thread).Connection.WriteBuffer( TransferMessage, SizeOf(TransferMessage), True); //Problems

Break;
End;
End;
End;
Finally
QClients.UnlockList;
End;
end;

procedure TMain1.FormCreate(Sender: TObject);
begin
QClients := TThreadList.Create;
end;

procedure TMain1.DisconnetThis1Click(Sender: TObject);
Var
I : Integer;
Hand : PClient; //Disconnet without have a thred with name
begin
Try
With QClients.LockList Do
Begin
For I := 0 To Count - 1 Do
Begin //Find user with this same item
Hand := Items[I];
IF Hand.Name = Trim(ListBox1.Items.Strings
[ListBox1.Itemindex]) Then
Begin
TIdContext(Hand.Thread).Connection.Disconnect;

Break;
End;
End;
End;
Finally
QClients.UnlockList;
End;

end;

procedure TMain1.MenuItem1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
end;

end.



با تشکر

BORHAN TEC
چهارشنبه 26 مهر 1391, 23:31 عصر
در مورد معادل ReadBuffer و WriteBuffer در Indy 10 به صورت کامل در لینک زیر توضیح داده شده است:
http://www.delphigroups.info/2/6/204317.html