Chat Room Socket (Delphi)
Contents
Description
This example builds a Chat Room using sockets components. To build the example, follow the instructions:
- Install the socket components.
- Create a VCL Forms Application and save it as Server.
- In the Project Manager, right-click ProjectGroup1 > Add New Project and add a new VCL Forms Application. Save it as Client.
- Add two buttons (Send and Start/Stop), a memo box, an edit box, and a TServerSocket from the Tool Palette to the Server form.
- Add two buttons (Send and Connect/Disconnect), a memo box, an edit box, and a TClientSocket from the Tool Palette to the Client form.
Code
-
In Server.pas
- Add to the TForm1 class a private variable,
Str
, of type String, in which to save the messages received or sent by the server. - Add the code below to the OnClick event of the Start button:
procedure TForm1.Button2Click(Sender: TObject); begin if(ServerSocket1.Active = False)//The button caption is ‘Start’ then begin ServerSocket1.Active := True;//Activates the server socket Memo1.Text:=Memo1.Text+'Server Started'+#13#10; Button2.Caption:='Stop';//Set the button caption end else//The button caption is ‘Stop’ begin ServerSocket1.Active := False;//Stops the server socket Memo1.Text:=Memo1.Text+'Server Stopped'+#13#10; Button2.Caption:='Start'; //If the server is closed, then it cannot send any messages Button1.Enabled:=false;//Disables the “Send” button Edit1.Enabled:=false;//Disables the edit box end; end;
- Add the code below to the OnClick event of the Send button:
procedure TForm2.Button1Click(Sender: TObject); var i: integer; begin Str:=Edit1.Text;//Take the string (message) sent by the server Memo1.Text:=Memo1.Text+'me: '+Str+#13#10;//Adds the message to the memo box Edit1.Text:='';//Clears the edit box //Sends the messages to all clients connected to the server for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do ServerSocket1.Socket.Connections[i].SendText(str);//Sent end;
- Add the code below to the OnClientConnect event of TServerSocket:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Socket.SendText('Connected');//Sends a message to the client //If at least a client is connected to the server, then the server can communicate //Enables the Send button and the edit box Button1.Enabled:=true; Edit1.Enabled:=true; end;
- Add the code below to the OnClientDisconnect event of TServerSocket:
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); Begin //The server cannot send messages if there is no client connected to it if ServerSocket1.Socket.ActiveConnections-1=0 then begin Button1.Enabled:=false; Edit1.Enabled:=false; end; end;
- Add the code below to the OnClientRead event of TServerSocket:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); Begin //Read the message received from the client and add it to the memo text // The client identifier appears in front of the message Memo1.Text:=Memo1.Text+'Client'+IntToStr(Socket.SocketHandle)+' :'+Socket.ReceiveText+#13#10; end;
- Add to the TForm1 class a private variable,
- In Client.pas
- Add to the TForm2 class a private variable,
Str
, of type String, in which to save the messages received or sent by the client. - Add the code below to the OnClick event of the Connect button:
procedure TForm2.Button2Click(Sender: TObject); begin //127.0.0.1 is the standard IP address to loop back to your own machine ClientSocket1.Address:='127.0.0.1'; ClientSocket1.Active := True;//Activates the client if(ClientSocket1.Socket.Connected=True) then begin str:='Disconnected'; ClientSocket1.Active := False;//Disconnects the client Button2.Caption:='Connect'; end; end;
- Add the code below to the OnClick event of the Send button:
procedure TForm2.Button1Click(Sender: TObject); begin Str:=Edit1.Text; Memo1.Text:=Memo1.Text+'me: '+str+#13#10; Edit1.Text:='';//Clears the edit box ClientSocket1.Socket.SendText(str);//Send the messages to the server end;
- Add the code below to the OnDisconnect event of TClientSocket:
procedure TForm2.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Text:=Memo1.Text+'Disconnect'+#13#10; Socket.SendText(str);//Send the “Disconnected” message to the server //str is set to “Disconnected” when the Disconnect button is pressed //A client cannot send messages if it is not connected to a server Button1.Enabled:=False; Edit1.Enabled:=False; Button2.Caption:='Connect'; end;
- Add the code below to the OnError event of TClientSocket:
procedure TForm2.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode:=0; ClientSocket1.Active := False; // This can happen when no active server is started Memo1.Text:=Memo1.Text+'No connection found'+#13#10; end;
- Add the code below to the OnRead event of TClientSocket:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin //Reads and displays the message received from the server; Memo1.Text:=Memo1.Text+'Server: '+Socket.ReceiveText+#13#10; end;
- Add to the TForm2 class a private variable,
To test the example:
- In the Project Manager, right-click Server.exe and then press Run.
- Right-click Client.exe and then Run without debugging.
- Start the Server by pressing the Start button from the server form.
- Connect the Client by pressing the Connect button from the client form.
- Start sending messages from server to client, and from client to server.