Question

Sending/Receiving Binary data usint Indy 10

Asked by: otaibits

Need working example of using IdCMDTCPServer and IdCMDTCPClient to send and receive Binary data and streams.  One Delphi server application need to communicate with several delphi client applications and be able to transfer similar size data records among the clients using Indy10.  Need very simple example.  Must work!

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. binary
    What is the fastest way to insert a record with binary data in TQuery ? Andrew
  2. Binary file transfer
    I want to transmit a binary file with my cgi-executable. As I beleave I must to write at first a caption like: "Content-type: ...." What have I to write exactly? And what have I to do after that?
  3. Writing to Binary File on the Internet?
    I have a binary file on the internet, I would like to write a stream of data (Strings, Integers, Reals, Dates, etc.) to the end of. Lets say for example the URL was http://www.mydomain.com/myfolder/myfile.dat from my delphi application, how can i connect to that file, open...
  4. binary
    my problem I am reading bin file and trasfer data in text file.. when read the txt file then it showing me garbage data. even if i open the file still showing me grabe data any Q.. after trasfering data from binery file to text file my thought will be read the txt file and ...
  5. Binary to ASCII
    Hello, I need is a function that Opens a File using TFileStream ( it could be a binary file or text ), Read this file in a String, do "something" and Save it back as a File. Could anybody help me? k4hvd77

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: MaximKorobovPosted on 2008-06-01 at 06:09:59ID: 21686901

You can download INDY9 demos (which is also work with 10) from INDY site:
http://indyproject.org/Sockets/Demos/index.EN.aspx
Look at "The 'old' Indy 9 demos" and folder IdTCPDemo inside the archive.

To work with many clients you should set MaxConnectionCount to your value (2+).
You can make specified data Class and send/receive them or send data like '<request>YOUR_DATA_TO_PROCESSING</request>' and parse them on receiving (use Pos function).

 

by: otaibitsPosted on 2008-06-01 at 07:06:40ID: 21687182

I am sorry but INDY9 demos do not always work with 10 because of the restructuring and component redesign..,  I have been there.  My question is clear: I need to use Indy10 'NEW' idCMDTCPServer and idCMDTCPClient to send BINARY data, NOT Text wher I can use Oos Function.  I also asked for WRKING example.

Here is a working example using subject components to send/receive clear text:


//*********************Sever
unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
  IdCmdTCPServer, StdCtrls, IdContext, IdUri, IdCommandHandlers;
 
type
  TfrmMain = class(TForm)
    OtaibiList: TListBox;
    OtaibiServer: TIdCmdTCPServer;
    procedure FormCreate(Sender: TObject);
    procedure OtaibiServerConnect(AContext: TIdContext);
    procedure OtaibiServerDisconnect(AContext: TIdContext);
    procedure OtaibiServerCommandHandlers1Command(ASender: TIdCommand);
    procedure OtaibiServerExecute(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  frmMain: TfrmMain;
 
implementation
 
{$R *.dfm}
 
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  OtaibiServer.Active := True;
end;
 
procedure TfrmMain.OtaibiServerCommandHandlers1Command(ASender: TIdCommand);
begin
   OtaibiList.Items.Add('Execute command from: ' +
     ASender.Context.Connection.Socket.Binding.PeerIP);
   ASender.SendReply;
   ASender.Context.Connection.IOHandler.WriteLn('This is a dynamic response ' +
                 'from the Otaibi Server. It can be customized to add much ' +
                 'more functionality.');
end;
 
procedure TfrmMain.OtaibiServerConnect(AContext: TIdContext);
begin
  OtaibiList.Items.Add('Connected from: ' +
    AContext.Connection.Socket.Binding.PeerIP);
end;
 
procedure TfrmMain.OtaibiServerDisconnect(AContext: TIdContext);
begin
  OtaibiList.Items.Add('Disconnected from: ' +
    AContext.Connection.Socket.Binding.PeerIP);
end;
 
procedure TfrmMain.OtaibiServerExecute(AContext: TIdContext);
var
  strCommand: string;
begin
  strCommand := AContext.Connection.IOHandler.ReadLn;
  if SameText (strCommand, 'text') then
     AContext.Connection.IOHandler.WriteLn('200 OK');
end;
 
end.
 
//*********************Client
unit MainClient;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;
 
type
  TfrmMain = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    OtaibiClient: TIdTCPClient;
    eHost: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  frmMain: TfrmMain;
 
implementation
 
{$R *.dfm}
 
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  If eHost.Text = '' then OtaibiCLient.Host := 'localhost'
  else OtaibiClient.Host := eHost.Text;
 
  OtaibiClient.Connect;
 
  ShowMessage (OtaibiClient.IOHandler.ReadLn);
end;
 
procedure TfrmMain.Button2Click(Sender: TObject);
begin
  OtaibiClient.Disconnect;
end;
 
procedure TfrmMain.Button3Click(Sender: TObject);
begin
  OtaibiClient.SendCmd('test') ;
  ShowMessage (OtaibiClient.LastCmdResult.Code + ' : ' +
               OtaibiClient.LastCmdResult.Text.Text);
end;
 
procedure TfrmMain.Button4Click(Sender: TObject);
begin
  OtaibiClient.SendCmd('execute') ;
  ShowMessage (OtaibiClient.LastCmdResult.Code + ' : ' +
               OtaibiClient.LastCmdResult.Text.Text);
  ShowMessage (OtaibiClient.IOHandler.ReadLn);
end;
 
end.
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:

Select allOpen in new window

 

by: MaximKorobovPosted on 2008-06-01 at 09:09:42ID: 21687523

What type of variable, which is constains Binary data have you got?
You can represent Binary as String "10100111..." and as array of Byte.

 

by: otaibitsPosted on 2008-06-01 at 10:01:51ID: 21687702

OK, now we are talking!  I want to send recoed contents that may vary in length depending on record contents; for example:
___________________
PlayerHand=record
  Player:PayerPostion (East,West,North, or South);
  Hand:array[1..8] of TCard;
  Play:PlayType (Suit,Trump, or none);
  Straights: SequenceType (Simple, Flush, Royal,..)
end
___________________
can you help?

 

by: MaximKorobovPosted on 2008-06-01 at 11:16:02ID: 21687905

I think that you should solve vary in length by using your own data transmittion protocol. So, on one side you get info from your record type and make string to send. For your example it can looks like:
<PlayerHand><Player>1</Player><Hand><FieldOne>23424</FieldOne><FieldTwo>Hello!</FieldTwo></Hand> ... </PlayerHand>

This is just example. XML-like tags are only for comfortable reading.
Of course it require from you to write functions, which are convert filled record types to one string.

------------------------------------------------------------------------------------------

On a answer side you parse XML-like requests:
1. Check, does you receive full record?
HaveAll := ((Pos('<PlayerHand>',ReceivedString) = 1) and (Pos('</PlayerHand>', ReceivedString) = Length(ReceivedString) - 1 - Length('</PlayerHand>'));
2. Remove this tags
ReceivedString := Copy(ReceivedString, Length('<PlayerHand>') + 1, Length(ReceivedString) - 1 - Length('</PlayerHand>'));
3. Check, does you receive <Player> and </Player> tags?
4. Read value inside this tags
Player := Copy(...)
5. Remove this tags

And so on (steps 3-5) for all attributes of your records.
It's simple to do if you understand me correctly.

 

by: TheRealLokiPosted on 2008-06-02 at 20:45:27ID: 21697440

There are 2 methods that come to mind.
Firstly, if you were to create your objects as descendents of TPersistent then you can use ReadComponent and WriteComponent to load/save it to a stream (and send it via indy)
basic example of this here...
http://beensoft.blogspot.com/2006/11/how-to-persist-tpersistent.html
Or, you could make your own "SaveToStream" method which saves each property

e.g.
MyStream.Write(playercount, sizeof(playercount))l;
..
// write one PlayerHand
j := integer(PlayerPosition);
MyStream.Write( j, sizeof(j));
for i := 0 to length(hand) do
begin
// write each card
  MyStream.Write(Hand[i].Value, sizeof(Hand[i].Value));
end;
// write PlayType
j := integer(Play); // playtype
MyStream.Write( j, sizeof(j));
// write Straights (SequenceType)
j := integer(Straights); // SequenceType
MyStream.Write( j, sizeof(j));

 

by: MaximKorobovPosted on 2008-07-13 at 00:54:08ID: 21991640

I take you simple realization idea and TheRealLoki some more intresting.
If you don't fully understand how to use streams, choose my version - write your own very simple protocol.

 

by: otaibitsPosted on 2008-07-14 at 04:42:59ID: 21997158

Eventhough I asked for a working example, i have to admit that both responses helped me develop a solution of my own.  Please go ahead and split points to expert responces:  {http:#a21687523} & {http:#a21697440}

Thanks

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...